C# 利用反射机制动态构建配置文件中类的对象

本文介绍如何使用C#反射机制动态创建配置文件指定的类实例。通过抽象工厂模式简化了动态加载DLL的过程,实现了根据不同服务对象灵活配置功能的目的。

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值