首页 后端开发 C#.Net教程 .Net配置文件——反射+配置文件存储类型实例

.Net配置文件——反射+配置文件存储类型实例

Feb 24, 2017 am 10:26 AM

                配置文件+反射确实去除了选择语句的繁琐,带来了优美的赶脚!

              首先改进了一下类(接上文):

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=&#39;color:red&#39;>" + gs.GreetingType + "</span>";
            }
        }
        public void GeneralMethod(ITextControl textContrl)
        {
            //做一些额外的工作,这里省略
            gs.SetGreetingWords(textContrl);
            textContrl.Text = "<span sytle=&#39;color:red&#39;>" + textContrl.Text + "</span>";
            //省略。。。。。。。
        }


    }

}
登录后复制

然后在配置文件中定义好我们要使用的具体类和自定义标签的处理程序:

  <!--greetingStrategy节点及其处理程序配置-->
  <configSections>
    <section name="greetingStrategy" type="ClassLib.GreetingConfigurationHandler,ClassLib"/>
  </configSections>
  <greetingStrategy type="ClassLib.ChineseGreeting,ClassLib">
    <params greetingType="***中文问候***"/>  <!--构造函数的参数-->
  </greetingStrategy>
登录后复制

这里,ChineseGreeting是我们要使用的类,上面定义的是处理greetingStrategy的类;

接着,写这个类的具体实现:

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 ;
        }
    }
}
登录后复制

在创建方法中,我们先判断ChineseGreeting类有没有一个参数为节点的构造方法,如果有的话,就直接将section当作参数,在利用反射创建类型实例的时候传进去;

如果没有这样的构造方法,我们就在这个处理类里面读取XML文件中的参数,然后在类型实例化的时候传进去;

两种方式比较,其实都是一样的,只过是这个参数读取的早晚的问题;个人对比了下,觉得在这个类里面读取配置文件中的构造函数参数的方式更加灵活,个人偏爱。

写个东西测试下:

 #region 自定义节点存储类型信息——反射方法
            IGreetingStrategy greetingStrategy = (IGreetingStrategy)ConfigurationManager.GetSection("greetingStrategy");
            if (greetingStrategy != null)
            {
                GeneralClass generalClass = new GeneralClass(greetingStrategy);
                ltrGreetingType.Text = generalClass.GeneralProperty;
                generalClass.GeneralMethod(ltrGreetingWord);
            }
            #endregion
登录后复制

         嘿嘿,相对方便。

        

        感觉反射强大在把变化抽出来,但是抽出来的这个变化放到哪里去最容易改动或者是后期维护成本较低,于是配置文件这时候就该上了。。。。。。

 以上就是.Net配置文件——反射+配置文件存储类型实例的内容,更多相关内容请关注PHP中文网(www.php.cn)!







本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
Java 中接口和抽象类的反射机制实现 Java 中接口和抽象类的反射机制实现 May 02, 2024 pm 05:18 PM

反射机制允许程序在运行时获取和修改类信息,它可用于实现接口和抽象类的反射:接口的反射:通过Class.forName()获取接口反射对象,访问其元数据(名称、方法和字段)。抽象类的反射:与接口类似,可获取抽象类的反射对象,访问其元数据以及非抽象方法。实战案例:反射机制可用于实现动态代理,通过动态创建代理类在运行时拦截对接口方法的调用。

golang 如何使用反射访问私有字段和方法 golang 如何使用反射访问私有字段和方法 May 03, 2024 pm 12:15 PM

Go语言中可以使用反射来访问私有字段和方法:访问私有字段:通过reflect.ValueOf()获取值的反射值,再使用FieldByName()获取字段的反射值,并调用String()方法打印字段的值。调用私有方法:同样通过reflect.ValueOf()获取值的反射值,再使用MethodByName()获取方法的反射值,最后调用Call()方法执行方法。实战案例:通过反射修改私有字段值和调用私有方法,实现对对象的控制和单元测试覆盖。

win10用户配置文件在哪? Win10设置用户配置文件的方法 win10用户配置文件在哪? Win10设置用户配置文件的方法 Jun 25, 2024 pm 05:55 PM

最近有不少Win10系统的用户想要更改用户配置文件,但不清楚具体如何操作,本文将给大家带来Win10系统设置用户配置文件的操作方法吧!Win10如何设置用户配置文件1、首先,按下“Win+I”键打开设置界面,并点击进入到“系统”设置。2、接着,在打开的界面中,点击左侧的“关于”,再找到并点击其中的“高级系统设置”。3、然后,在弹出的窗口中,切换到“”选项栏,并点击下方“用户配

分享几个.NET开源的AI和LLM相关项目框架 分享几个.NET开源的AI和LLM相关项目框架 May 06, 2024 pm 04:43 PM

当今人工智能(AI)技术的发展如火如荼,它们在各个领域都展现出了巨大的潜力和影响力。今天大姚给大家分享4个.NET开源的AI模型LLM相关的项目框架,希望能为大家提供一些参考。https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一种开源的软件开发工具包(SDK),旨在将大型语言模型(LLM)如OpenAI、Azure

golang 反射的安全性考虑和最佳方案 golang 反射的安全性考虑和最佳方案 May 04, 2024 pm 04:48 PM

反射在Go中提供类型检查和修改功能,但存在安全隐患,包括任意代码执行、类型伪造和数据泄露。最佳方案包括限制反射权限、操作、使用白名单或黑名单、验证输入以及使用安全工具。实践中,反射可安全用于检查类型信息。

在Ubuntu上安装Helm 在Ubuntu上安装Helm Mar 20, 2024 pm 06:41 PM

Helm是Kubernetes的一个重要组件,它通过将配置文件捆绑到一个称为HelmChart的包中来简化Kubernetes应用程序的部署。这种方法使得更新单个配置文件比修改多个文件更加便捷。借助Helm,用户可以轻松地部署Kubernetes应用程序,简化了整个部署过程,提高了效率。在本指南中,我将介绍在Ubuntu上实现Helm的不同方法。请注意:以下指南中的命令适用于Ubuntu22.04以及所有Ubuntu版本和基于Debian的发行版。这些命令经过测试,应该在您的系统上正常运行。在U

golang 如何使用反射动态修改变量值 golang 如何使用反射动态修改变量值 May 02, 2024 am 11:09 AM

Go语言反射允许在运行时操控变量值,包括修改布尔值、整数、浮点数和字符串。通过获取变量的Value,可以调用SetBool、SetInt、SetFloat和SetString方法进行修改。例如,可以解析JSON字符串为结构体,然后使用反射修改结构体字段的值。需要注意,反射操作较慢,且无法修改不可修改字段,修改结构体字段值时可能不会自动更新相关字段。

golang函数利用反射实现面向切面的编程 golang函数利用反射实现面向切面的编程 Apr 25, 2024 pm 05:48 PM

答案:是的,Go语言中的反射可以实现面向切面的编程。详细描述:反射允许程序在运行时修改和检查自己的类型和值。通过反射,我们可以为代码创建全局切面,在函数执行前、后触发。这使我们能够轻松添加日志记录等功能,而无需修改现有代码。反射提供了代码解耦、可扩展性以及灵活控制的优点,从而提高了应用程序的可维护性和可重用性。

See all articles