C# 利用反射机制动态构建配置文件中类的对象
在产品项目进行中我们难免会遇到因为项目服务对象不同,实现也不同的功能。
这样每次修改后重新编译整个解决方案后更新耗时耗力。
其实使用静态工厂,我们可以很容易的引入额外的dll来动态的配置这些功能的实现
首先下面是所有工厂的基类,其中包含了一个读取配置文件的方法,和一个生成对象的静态方法

/// <summary> /// 所有工厂基类 ///<author name="Jan.David"></author> ///<![CDATA[2010-11-05]]> /// </summary>public abstract class AbstractFactory { /// <summary> /// 读取设置文件内的值 /// </summary> /// <param name="parentNode"></param> /// <param name="key"></param> /// <returns></returns> public static string ReadSettring( string parentNode, string key) { string FilePath = AppDomain.CurrentDomain.BaseDirectory; // 项目路径 // 新建xml文档对象 System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); // 读取文档 doc.Load(FilePath + " /Setting.xml "); // 获取根节点 System.Xml.XmlNodeList Root = doc.FirstChild.NextSibling.ChildNodes; System.Xml.XmlNodeList nodes = default(System.Xml.XmlNodeList); foreach (System.Xml.XmlNode node in Root) { if (node.Name.ToLower() == parentNode.ToLower()) { nodes = node.ChildNodes; break; } } if (nodes != null && nodes.Count > 0) { foreach (System.Xml.XmlNode node in nodes) { if (node.Attributes[ " name "].Value.ToLower() == key.ToLower()) { return node.Attributes[ " value "].Value; } } } return null; } /// <summary> /// 实例化一个对象 /// </summary> /// <typeparam name="T"> 要实例化的类型 </typeparam> /// <param name="ClassName"> 需要实例化的类名 </param> /// <param name="obj"> 实例化对象存储的变量 </param> public abstract void CreateInstanc<T>( string className, ref T obj); }
下面是具体的实现

class BillCodeFactory : AbstractFactory { #region 属性 private static string RETURNS = ReadSettring("BillCode", "Returns");//销售退货 #endregion /// <summary> /// 实例化一个对象 /// </summary> /// <typeparam name="T">要实例化的类型</typeparam> /// <param name="ClassName">需要实例化的类名</param> /// <param name="obj">实例化对象存储的变量</param> public override void CreateInstanc<T>(string className, ref T obj) { obj = (T)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance( className, false); } public string Returns { get { return ReadSettring("BillCode", "Returns"); } } }
配置文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <BillCode> <add name="Returns" value ="IBillCodeImplt.Returns"></add> </BillCode> </configuration>