.Net配置文件——反射+配置文件存储类型实例
配置文件+反射确实去除了选择语句的繁琐。带来了优美的赶脚!
首先改进了一下类(接上文):
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>"; //省略。。。。
。。。
} } }
然后在配置文件里定义好我们要使用的详细类和自己定义标签的处理程序:
<!--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
嘿嘿,相对方便。
感觉反射强大在把变化抽出来,可是抽出来的这个变化放到哪里去最easy修改或者是后期维护成本较低。于是配置文件这时候就该上了。。。
。
。
。
相关文章
- ASP .NET CORE MVC 部署Windows 系统上 IIS具体步骤---.Net Core 部署到 IIS位系统中的步骤
- ASP.NET Core消息队列RabbitMQ基础入门实战演练
- net-snmp配置文件snmp.conf
- Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
- asp.net C#数据导出Excel实例介绍
- asp.net中C#获取字符串中汉字的个数实例
- asp.net输出重写压缩页面文件实例
- NET Core-学习笔记(二)
- Java与.NET兼容的RSA密钥持久化方法
- .Net配置文件——反射+配置文件存储类型实例
- 重新整理 .net core 周边阅读篇————AspNetCoreRateLimit[一]
- .net core 认证与授权(一)
- ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境
- ASP.NET Core 6框架揭秘实例演示[28]:自定义一个服务器
- ASP.NET Core 6框架揭秘实例演示[20]:“数据保护”框架基于文件的密钥存储
- ASP.NET Core 6框架揭秘实例演示[18]:HttpClient处理管道
- ASP.NET Core 6框架揭秘实例演示[09]:将配置绑定为对象
- ASP.NET Core 6框架揭秘实例演示[06]:依赖注入框架设计细节
- ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
- .NET下载文件报错System.UnauthorizedAccessException的解决方法
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
- Atitit. C#.net clr 2.0 4.0 4.5新特性 v2 s22 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0新特性4 4. CLR 4 新特性
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
- Solutions Schedule 9.0 for .NET Crack
- 你的NET程序需要保护吗?Agile.net 6.6.X 注入式Crack
- net start mysql 无法启动mysql解决方案之一【NET HELPMSG 3534】
- ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
- FastReport Business Graphics .NET
- Aspose.OCR 22.11.1 for .NET Crack
- ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
- 【.Net实用方法总结】 整理并总结文件和流、异步文件IO、处理IO错误