


Fichier de configuration .Net - exemple de type de stockage de fichier de configuration de réflexion
La réflexion du fichier de configuration supprime la sélection fastidieuse de l'instruction, apportant un beau rush !
D'abord amélioré la classe (connectée ci-dessus) :Définissez ensuite les spécificités que nous souhaitons utiliser dans le fichier de configuration que nous souhaitons utiliser les classes et des gestionnaires de balises personnalisés :
namespace ClassLib { /// <summary> /// Interface IGreetingStrategy /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:01:58</remarks> public interface IGreetingStrategy { string GreetingType { get; } void SetGreetingWords(ITextControl textContrl); } /// <summary> /// Class EnglishGreeting /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:02:38</remarks> public class EnglishGreeting : IGreetingStrategy { public string GreetingType { get { return "English"; } } public void SetGreetingWords(ITextControl textContrl) { textContrl.Text = "hello,readers"; } } /// <summary> /// Class ChineseGreeting /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:02:56</remarks> public class ChineseGreeting : IGreetingStrategy { private string greetingType; public ChineseGreeting(string greetingType) { this.greetingType = greetingType; } public ChineseGreeting() : this("中文") { } public ChineseGreeting(XmlNode section) { XmlAttribute attr = section.SelectSingleNode("params").Attributes["greetingType"];//获取属性值 greetingType = attr.Value;//为字段赋值 } public string GreetingType { get { return greetingType; } } public void SetGreetingWords(ITextControl textContrl) { textContrl.Text = "你好啊,小读者!"; } } /// <summary> /// Class GeneralClass:这个类可能还有很多的字段,属性,方法,这里只是简写下 /// PS:GeneralClass是一个普通的类型,这个类内部维护着IGreetingStrategy,调用的时候还是根据多态具体调用。 /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:08:04</remarks> public class GeneralClass { private IGreetingStrategy gs; public GeneralClass(IGreetingStrategy gs) { this.gs = gs; } public string GeneralProperty { get { //做一些额外的工作,这里省略 return "<span sytle='color:red'>" + gs.GreetingType + "</span>"; } } public void GeneralMethod(ITextControl textContrl) { //做一些额外的工作,这里省略 gs.SetGreetingWords(textContrl); textContrl.Text = "<span sytle='color:red'>" + textContrl.Text + "</span>"; //省略。。。。。。。 } } }
Ici, ChineseGreeting est la classe que nous voulons utiliser, et la classe définie ci-dessus est la classe qui gère GreetingStrategy
<!--greetingStrategy节点及其处理程序配置--> <configSections> <section name="greetingStrategy" type="ClassLib.GreetingConfigurationHandler,ClassLib"/> </configSections> <greetingStrategy type="ClassLib.ChineseGreeting,ClassLib"> <params greetingType="***中文问候***"/> <!--构造函数的参数--> </greetingStrategy>
Ensuite, écrivez l'implémentation spécifique de cette classe :
Dans la méthode de création, nous déterminons d'abord si la classe ChineseGreeting a une méthode de construction avec un paramètre comme nœud. Si c'est le cas, utilisons directement section comme paramètre et transmettez-la lors de l'utilisation de la réflexion pour créer une instance de type
namespace ClassLib { public class GreetingConfigurationHandler : IConfigurationSectionHandler { /* 处理有参数的构造函数的对象的创建: */ /// <summary> /// 创建配置节处理程序。 /// </summary> /// <param name="parent">父对象。</param> /// <param name="configContext">配置上下文对象。</param> /// <param name="section">节 XML 节点。</param> /// <returns>创建的节处理程序对象。</returns> /// <exception cref="System.NotImplementedException"></exception> /// <remarks>Editor:v-liuhch CreateTime:2015/6/30 20:34:54</remarks> public object Create(object parent, object configContext, System.Xml.XmlNode section) { //获取节点type属性的值 Type t = Type.GetType(section.Attributes["type"].Value); object obj=null; try { /* 2,在要实例的类中加入一个构造函数,接收一个XmlNode节点,将greeting_stragetgy的节点在此传递,然后在这个构造函数中进行处理;*/ //如果t包含有参数为xmlnode的构造函数,直接使用这个构造函数 Type[] paras = { typeof(XmlNode) }; ConstructorInfo constructors = t.GetConstructor(paras); if (constructors != null) { object[] paramters = { section }; return Activator.CreateInstance(t, paramters); //传入读取到的构造函数的参数 } if (section.SelectSingleNode("params") == null) //无参数构造函数 { obj = Activator.CreateInstance(t); } else //有参数构造函数 { /*1,在此类中对策略类进行处理,取得params节点的属性值,然后传递给具体实例化的类;*/ //获取params节点的属性greetingType的值 XmlAttribute attr = section.SelectSingleNode("params").Attributes["greetingType"]; object[] parameters = { attr.Value }; obj = Activator.CreateInstance(t, parameters); //传入读取到的构造函数的参数 } } catch (Exception) { return null; } return obj ; } } }
< ; 🎜> S'il n'existe pas une telle méthode de construction, nous lirons les paramètres dans le fichier XML dans cette classe de traitement, puis les transmettrons lorsque le type sera instancié
En comparant les deux ; méthodes, en fait c'est pareil, c'est juste une question de rapidité de lecture de ce paramètre ; après comparaison personnelle, j'estime que la façon de lire les paramètres du constructeur dans le fichier de configuration de cette classe est plus flexible, ce qui est mon personnel préférence.
Écrivez quelque chose à tester :
Héhé, c'est relativement pratique.
#region 自定义节点存储类型信息——反射方法 IGreetingStrategy greetingStrategy = (IGreetingStrategy)ConfigurationManager.GetSection("greetingStrategy"); if (greetingStrategy != null) { GeneralClass generalClass = new GeneralClass(greetingStrategy); ltrGreetingType.Text = generalClass.GeneralProperty; generalClass.GeneralMethod(ltrGreetingWord); } #endregion
Le coût est faible, le fichier de configuration doit donc être téléchargé à ce moment. . . . . .
Ce qui précède est le contenu du fichier de configuration .Net - instance de type de stockage du fichier de configuration de réflexion. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

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

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

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le mécanisme de réflexion permet aux programmes d'obtenir et de modifier des informations de classe au moment de l'exécution. Il peut être utilisé pour implémenter la réflexion d'interfaces et de classes abstraites : Réflexion d'interface : obtenez l'objet de réflexion d'interface via Class.forName() et accédez à ses métadonnées (nom, méthode et champ) . Réflexion de classes abstraites : Semblable aux interfaces, vous pouvez obtenir l'objet de réflexion d'une classe abstraite et accéder à ses métadonnées et méthodes non abstraites. Cas pratique : Le mécanisme de réflexion peut être utilisé pour implémenter des proxys dynamiques, en interceptant les appels aux méthodes d'interface au moment de l'exécution en créant dynamiquement des classes proxy.

Vous pouvez utiliser la réflexion pour accéder aux champs et méthodes privés en langage Go : Pour accéder aux champs privés : obtenez la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez FieldByName() pour obtenir la valeur de réflexion du champ, et appelez le Méthode String() pour imprimer la valeur du champ. Appelez une méthode privée : obtenez également la valeur de réflexion de la valeur via Reflect.ValueOf(), puis utilisez MethodByName() pour obtenir la valeur de réflexion de la méthode, et enfin appelez la méthode Call() pour exécuter la méthode. Cas pratique : modifiez les valeurs des champs privés et appelez des méthodes privées par réflexion pour obtenir le contrôle des objets et la couverture des tests unitaires.

Récemment, de nombreux utilisateurs du système Win10 souhaitent modifier le profil utilisateur, mais ils ne savent pas comment le faire. Cet article vous montrera comment définir le profil utilisateur dans le système Win10 ! Comment configurer un profil utilisateur dans Win10 1. Tout d'abord, appuyez sur les touches « Win+I » pour ouvrir l'interface des paramètres, puis cliquez pour accéder aux paramètres « Système ». 2. Ensuite, dans l'interface ouverte, cliquez sur « À propos » sur la gauche, puis recherchez et cliquez sur « Paramètres système avancés ». 3. Ensuite, dans la fenêtre contextuelle, passez à la barre d'options "" et cliquez sur "Configuration utilisateur" ci-dessous.

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

La réflexion du langage Go vous permet de manipuler des valeurs de variables au moment de l'exécution, notamment en modifiant les valeurs booléennes, les entiers, les nombres à virgule flottante et les chaînes. En obtenant la valeur d'une variable, vous pouvez appeler les méthodes SetBool, SetInt, SetFloat et SetString pour la modifier. Par exemple, vous pouvez analyser une chaîne JSON dans une structure, puis utiliser la réflexion pour modifier les valeurs des champs de la structure. Il convient de noter que l'opération de réflexion est lente et que les champs non modifiables ne peuvent pas être modifiés. Lors de la modification de la valeur du champ de structure, les champs associés peuvent ne pas être automatiquement mis à jour.

Helm est un composant important de Kubernetes qui simplifie le déploiement des applications Kubernetes en regroupant les fichiers de configuration dans un package appelé HelmChart. Cette approche rend la mise à jour d'un seul fichier de configuration plus pratique que la modification de plusieurs fichiers. Avec Helm, les utilisateurs peuvent facilement déployer des applications Kubernetes, simplifiant ainsi l'ensemble du processus de déploiement et améliorant l'efficacité. Dans ce guide, j'aborderai différentes manières d'implémenter Helm sur Ubuntu. Remarque : les commandes du guide suivant s'appliquent à Ubuntu 22.04 ainsi qu'à toutes les versions d'Ubuntu et aux distributions basées sur Debian. Ces commandes sont testées et devraient fonctionner correctement sur votre système. en U

La fonctionnalité de réflexion du langage Go permet à un programme d'inspecter et de modifier la structure d'un type au moment de l'exécution. En utilisant Type, Value et Reflect.Kind, nous pouvons obtenir les informations de type, les valeurs de champ et les méthodes de l'objet, et nous pouvons également créer et modifier des objets. Les méthodes d'opération spécifiques incluent : la vérification du type (TypeOf()), l'obtention de la valeur du champ (ValueOf(), FieldByName()), la modification de la valeur du champ (Set()) et la création d'un objet (New()).

Reflection fournit des fonctionnalités de vérification et de modification de type dans Go, mais il présente des risques de sécurité, notamment l'exécution de code arbitraire, la falsification de type et la fuite de données. Les meilleures pratiques incluent la limitation des autorisations et des opérations réfléchissantes, l'utilisation de listes blanches ou de listes noires, la validation des entrées et l'utilisation d'outils de sécurité. En pratique, la réflexion peut être utilisée en toute sécurité pour inspecter les informations de type.
