c#根据配置文件反射

由于项目中用到了反射,准备把各个类库都先写在配置文件中,然后读取配置文件,再对配置文件中配置的类库进行反射。

        这样做的好处是各个类库保持独立,其中一个类库出现问题不会影响其他类库,更新项目时,只要更新单个DLL就可以了。

       1. 首先看下配置文件怎样进行配置

       

      在上面的配置文件中创建了自定义节点processors,然后在processors节点下面对应的是方法节点。

      上面的项目中使用了两个方法,所以创建了两个节点。type表示程序集名称, method表示方法名称。

    2.看下怎样使用配置文件

     

[html] view plaincopy
 
  1. private void button1_Click(object sender, EventArgs e)  
  2.        {  
  3.            //返回配置文件中的节点名称和元数据信息  
  4.            IDictionary<String,MethodInfodic=LoadAppConfig(Application.StartupPath + "\App.config");  
  5.            //测试GetInfo方法  
  6.            var mi = dic["GetInfo"];  
  7.            var obj = Activator.CreateInstance(mi.DeclaringType);  
  8.            object[] para={"hello"};//如果数组的长度和参数的个数不匹配,会报异常  
  9.            //返回方法结果值  
  10.            object result = mi.Invoke(obj, para);  
  11.            MessageBox.Show(result.ToString());  
  12.        }  
  13.   
  14.        /// <summary>  
  15.        /// 读取配置文件  
  16.        /// </summary>  
  17.        /// <param name="path"></param>  
  18.        /// <returns></returns>  
  19.        private Dictionary<string, MethodInfo> LoadAppConfig(string filename)  
  20.        {  
  21.            var processors = new Dictionary<string, MethodInfo>();  
  22.            var xml = new XmlDocument();  
  23.            xml.Load(filename);  
  24.   
  25.            foreach (XmlNode node in xml.SelectNodes("configuration/processors/*"))  
  26.            {  
  27.                if (node.NodeType != XmlNodeType.Element)  
  28.                    continue;  
  29.   
  30.                var method = node.Name;  
  31.                try  
  32.                {  
  33.                    string typeName = node.Attributes["type"].Value;//程序集名称  
  34.                    string methodName = node.Attributes["method"].Value;//方法名称  
  35.                    var t = Type.GetType(typeName);  
  36.                    var m = t.GetMethod(methodName);  
  37.                    processors.Add(methodName, m);  
  38.                }  
  39.                catch (Exception e)  
  40.                {  
  41.                     
  42.                }  
  43.            }  
  44.            return processors;  
  45.        }  


  DEMO下载:http://download.csdn.net/detail/zx13525079024/4734769

http://blog.csdn.net/zx13525079024/article/details/8149517

原文地址:https://www.cnblogs.com/tianciliangen/p/4949099.html