


En plus d'utiliser la méthode d'héritage de IConfigurationSectionHandler pour définir une classe de traitement des nœuds personnalisés, vous pouvez également obtenir le même effet en héritant de la classe ConfigurationSection.
Tout d'abord, parlons d'une règle tacite dans le fichier de configuration .Net
Lors de la configuration d'un nœud, pour le paramètres que vous souhaitez stocker Les données peuvent être stockées de deux manières : l'une est stockée dans les attributs du nœud et l'autre est stockée dans le texte du nœud.
Parce qu'un nœud peut avoir de nombreux attributs, mais il n'y a qu'un seul texteintérieur, et il doit être ajouté au programme. La différenciation de ces deux formes crée des complications. Afin d'éviter ce problème, le fichier de configuration de .net est uniquement stocké avec des attributs au lieu d'utiliser innertext.
Ensuite, nous écrivons un fichier de configuration personnalisé conforme à cette règle tacite pour faciliter les tests :
<mailServerGroup provider="www.baidu.com"> <mailServers> <mailServer client="http://blog.csdn.net/lhc1105" address="13232@qq.com" userName="lhc" password="2343254"/> <mailServer client="http://blog345.csdn.net/lhc1105" address="132wdfgdsggtaewg32@qq.com" userName="dfshs水田如雅" password="2334t243的萨芬234254"/> <mailServer client="http://blog436.csdn.net/lhc1105" address="132wdgadsfgdtaewg32@qq.com" userName="sdfhdfs水田如雅" password="23ewrty2343的萨芬234254"/> <mailServer client="http://blo345734g.csdn.net/lhc1105" address="132wdgdfagdstaewg32@qq.com" userName="sdfher水田如雅" password="23erwt43的萨芬234254"/> </mailServers> </mailServerGroup>
Ensuite, nous écrivons la classe de traitement correspondante, ici nous écrivons de l'intérieur vers l'extérieur :
Le premier est le serveur de messagerie le plus interne :
/// <summary> /// Class MailServerElement:用于映射mailServer节点,这里是实际存储数据的地方; /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:51:57</remarks> public sealed class MailServerElement : ConfigurationElement //配置文件中的配置元素 { /// <summary> /// Gets or sets the client. /// </summary> /// <value>The client.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:40</remarks> [ConfigurationProperty("client", IsKey = true, IsRequired = true)] //client是必须的key属性,有点儿主键的意思,例如,如果定义多个client相同的节点,循环读取的话就只读取到最后一个值 public string Client { get { return this["client"] as string; } set { this["client"] = value; } } /// <summary> /// Gets or sets the address. /// </summary> /// <value>The address.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:38</remarks> [ConfigurationProperty("address")] public string Address { get { return this["address"] as string; } set { this["address"] = value; } } /// <summary> /// Gets or sets the name of the user. /// </summary> /// <value>The name of the user.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:35</remarks> [ConfigurationProperty("userName")] public string UserName { get { return this["userName"] as string; } set { this["userName"] = value; } } /// <summary> /// Gets or sets the password. /// </summary> /// <value>The password.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:33</remarks> [ConfigurationProperty("password")] public string Password { get { return this["password"] as string; } set { this["password"] = value; } } }
Ensuite, il y a les serveurs de messagerie, qui sont une collection de serveurs de messagerie :
/// <summary> /// Class MailServerCollection:映射mailServers节点,为一个集合类,另外还包含了很多对节点的操作方法,大部分继承自ConfigurationElementCollection /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:52:00</remarks> public sealed class MailServerCollection : ConfigurationElementCollection { /// <summary> /// 获取 <see cref="T:System.Configuration.ConfigurationElementCollection" /> 的类型。 /// </summary> /// <value>The type of the collection.</value> /// <returns>此集合的 <see cref="T:System.Configuration.ConfigurationElementCollectionType" />。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:08</remarks> public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } /// <summary> /// 当在派生的类中重写时,创建一个新的 <see cref="T:System.Configuration.ConfigurationElement" />。 /// </summary> /// <returns>新的 <see cref="T:System.Configuration.ConfigurationElement" />。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:03</remarks> protected override ConfigurationElement CreateNewElement() { return new MailServerElement(); } /// <summary> /// 在派生类中重写时获取指定配置元素的元素键。 /// </summary> /// <param name="element">要为其返回键的 <see cref="T:System.Configuration.ConfigurationElement" />。</param> /// <returns>一个 <see cref="T:System.Object" />,用作指定 <see cref="T:System.Configuration.ConfigurationElement" /> 的键。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:04:51</remarks> protected override object GetElementKey(ConfigurationElement element) { return (element as MailServerElement).Client; } /// <summary> /// 获取在派生的类中重写时用于标识配置文件中此元素集合的名称。 /// </summary> /// <value>The name of the element.</value> /// <returns>集合的名称;否则为空字符串。默认值为空字符串。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:41:40</remarks> protected override string ElementName { get { return "mailServer"; } } /// <summary> /// 获取集合中的元素数。 /// </summary> /// <value>The count.</value> /// <returns>集合中的元素数。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:08:24</remarks> public new int Count { get { return base.Count; } } /// <summary> /// 获取或设置此配置元素的属性、特性或子元素。 /// </summary> /// <param name="index">The index.</param> /// <returns>MailServerElement.</returns> /// <remarks>Editor:v-liuhch</remarks> public MailServerElement this[int index] { get { return BaseGet(index) as MailServerElement; } set { if (BaseGet(index) != null) { BaseRemoveAt(index); } BaseAdd(index, value); } } /// <summary> /// 获取或设置此配置元素的属性、特性或子元素。 /// </summary> /// <param name="Name">The name.</param> /// <returns>MailServerElement.</returns> /// <remarks>Editor:v-liuhch</remarks> new public MailServerElement this[string Name] { get { return BaseGet(Name) as MailServerElement; } } /// <summary> /// Indexes the of. /// </summary> /// <param name="element">The element.</param> /// <returns>System.Int32.</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:24:16</remarks> public int IndexOf(MailServerElement element) { return BaseIndexOf(element); } /// <summary> /// Adds the specified element. /// </summary> /// <param name="element">The element.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:26:06</remarks> public void Add(MailServerElement element) { BaseAdd(element); } /// <summary> /// Removes the specified element. /// </summary> /// <param name="element">The element.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:27:01</remarks> public void Remove(MailServerElement element) { if (BaseIndexOf(element) > 0) { BaseRemove(element.Client); } } /// <summary> /// Removes at. /// </summary> /// <param name="index">The index.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:33:29</remarks> public void RemoveAt(int index) { BaseRemoveAt(index); } /// <summary> /// Removes the specified client. /// </summary> /// <param name="client">The client.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:04</remarks> public void Remove(string client) { BaseRemove(client); } /// <summary> /// Clears this instance. /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:29</remarks> public void Clear() { BaseClear(); } }
Le dernier est le groupe le plus extérieur :
/// <summary> /// Class MailServerSection 为入口: /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:41:02</remarks> public class MailServerSection : ConfigurationSection //继承配置文件中节 { /// <summary> /// Gets the provider.:映射mailServerGroup节点的provider /// </summary> /// <value>The provider.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:59</remarks> [ConfigurationProperty("provider", IsKey = true)] public string provider { get { return this["provider"] as string; } } /// <summary> /// Gets or sets the mail servers.:映射新添加的节点mailServers节点;这个节点下还包含了若干个mailServer节点,因此它是一个集合类 /// </summary> /// <value>The mail servers.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:56</remarks> [ConfigurationProperty("mailServers", IsDefaultCollection = false)] public MailServerCollection MailServers { get { return this["mailServers"] as MailServerCollection; } set { this["mailServers"] = value; } } }
De même, le classe de traitement d'association et Node :
<section name="mailServerGroup" type="继承ConfigurationSection基类.MailServerSection,继承ConfigurationSection基类"/> </configSections>
Puis faites un test :
class Program { static void Main(string[] args) { Test(); } /// <summary> /// Tests this instance.:读取节点值示例 /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:04:53</remarks> private static void Test() { MailServerSection mailSection = (MailServerSection)ConfigurationManager.GetSection("mailServerGroup"); Console.WriteLine("MailServerSection 的provider属性值:"+mailSection.provider); foreach (MailServerElement config in mailSection.MailServers) { Console.WriteLine("----------------------------------"); Console.WriteLine("client值为:"+config.Client); Console.WriteLine("address值为:"+config.Address); Console.WriteLine("username值为:"+config.UserName); Console.WriteLine("password值为:"+config.Password); Console.WriteLine("----------------------------------"); } Console.ReadKey(); } }
Au départ, je voulais télécharger une photo des résultats, mais la vitesse d'Internet est lente, oubliez ça, je lancerai les résultats moi-même si j'aime jouer. . . . .
Ce qui précède est le contenu du fichier de configuration .Net - héritant de ConfigurationSection pour implémenter des classes de traitement personnalisées pour traiter les nœuds de configuration personnalisés. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois. (www.php.cn) !

C # est un langage de programmation moderne et orienté objet développé par Microsoft et dans le cadre du .NET Framework. 1.C # prend en charge la programmation orientée objet (POO), y compris l'encapsulation, l'héritage et le polymorphisme. 2. La programmation asynchrone en C # est implémentée via Async et attend des mots clés pour améliorer la réactivité des applications. 3. Utilisez LINQ pour traiter les collections de données concisement. 4. Les erreurs courantes incluent les exceptions de référence NULL et les exceptions indexes hors gamme. Les compétences de débogage comprennent l'utilisation d'un débogueur et une gestion des exceptions. 5. L'optimisation des performances comprend l'utilisation de StringBuilder et d'éviter l'emballage et le déballage inutiles.

Les stratégies de test pour les applications C # .NET comprennent les tests unitaires, les tests d'intégration et les tests de bout en bout. 1. Le test unitaire garantit que l'unité minimale du code fonctionne indépendamment, en utilisant le cadre MSTEST, NUnit ou Xunit. 2. Les tests intégrés vérifient les fonctions de plusieurs unités combinées et des données simulées couramment utilisées et des services externes. 3. Les tests de bout en bout simulent le processus de fonctionnement complet de l'utilisateur et le sélénium est généralement utilisé pour les tests automatisés.

L'entrevue avec C # Developer Senior Developer nécessite de maîtriser les connaissances de base telles que la programmation asynchrone, la LINQ et les principes de travail internes des frameworks .NET. 1. La programmation asynchrone simplifie les opérations par asynchronisation et attend pour améliorer la réactivité de l'application. 2.Linq exploite des données dans le style SQL et fait attention aux performances. 3. La CLR du cadre net gère la mémoire et la collecte des ordures doit être utilisée avec prudence.

C # .NET Les questions et réponses d'entrevue comprennent les connaissances de base, les concepts de base et l'utilisation avancée. 1) Connaissances de base: C # est un langage orienté objet développé par Microsoft et est principalement utilisé dans le framework .NET. 2) Concepts de base: la délégation et les événements permettent des méthodes de liaison dynamiques, et LINQ fournit des fonctions de requête puissantes. 3) Utilisation avancée: la programmation asynchrone améliore la réactivité et les arbres d'expression sont utilisés pour la construction de code dynamique.

C # .NET est un choix populaire pour construire des microservices en raison de son fort écosystème et de son riche soutien. 1) Créez RestulAPI à l'aide d'Asp.Netcore pour traiter la création et la requête de l'ordre. 2) Utilisez GRPC pour obtenir une communication efficace entre les microservices, définir et mettre en œuvre les services de commande. 3) Simplifiez le déploiement et la gestion via des microservices conteneurisés Docker.

Les meilleures pratiques de sécurité pour C # et .NET incluent la vérification des entrées, le codage de sortie, la gestion des exceptions, ainsi que l'authentification et l'autorisation. 1) Utilisez des expressions régulières ou des méthodes intégrées pour vérifier les entrées afin d'empêcher les données malveillantes d'entrer dans le système. 2) Encodage de sortie pour empêcher les attaques XSS, utilisez la méthode HTTPutility.htmLencode. 3) La gestion des exceptions évite la fuite d'informations, enregistre les erreurs mais ne renvoie pas d'informations détaillées à l'utilisateur. 4) Utilisez ASP.NetIdentity et l'autorisation fondée sur les réclamations pour protéger les applications contre l'accès non autorisé.

La signification du colon (':') dans le langage C: déclaration conditionnelle: séparation des expressions conditionnelles et de l'instruction Block Loop Instruction: séparation d'initialisation, d'expression conditionnelle et incrémentale Définition de macro: séparation du nom de macro et de la macro-valeur commentaire: représentant le contenu du côlon à la fin de la ligne comme dimension de tableau de commentaire: spécifiez la dimension du tableau

A Langue en C est un opérateur post-augmentation, et son mécanisme de fonctionnement comprend: l'obtention d'abord de la valeur de la variable a. Augmenter la valeur de A de 1. Renvoie la valeur de A après augmenter.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire