天天看点

C# 动态加载类

貌似大多时候我们创建一个对象最终都是用new运算符生成的

反射允许我们动态的加载类,也就是说完全可以在配置文件里决定究竟要选用哪个类

这样,就可以把数据库工厂,皮肤等写成类放在dll中,通过修改配置文件随意的改变

如我们有一个数据库工厂接口IDatabaseFactory,两个数据库工厂类实现这个接口:OracleFactory和SqlServerFactory

可以在配置文件中设置究竟要用Oracle数据库还是SqlServer数据库

关键的方法:

Assembly ass = Assembly.LoadFile(string filePath);

静态方法,从指定 绝对 路径加载程序集,返回Assembly实例

Type t = ass.GetType(string typeName);

获得指定的类型,如果该类型不存在,则返回null.注意:typeName应为完整的类型名,包括namespace.

ObjectHandle o = Activator.CreateInstance(Type t);

用默认构造函数创建指定类别的实例

贴上自己写的配置类代码 O(∩_∩)O

Config.cs

  1. // Coding by nyzhl
  2.     /// <summary>
  3.     /// 应用程序配置类
  4.     /// </summary>
  5.     public class Config
  6.     {
  7.         //配置文件路径
  8.         private readonly string m_xmlDocPath = @"Config.xml";
  9.         //数据库连接节点名
  10.         private readonly string ConnNodeName = "ConnectionString";
  11.         //数据库工厂程序集名
  12.         private readonly string DBFacAssNodeName = "DBFactoryAssembly";
  13.         //数据库工厂类名
  14.         private readonly string DBFacClsNodeName = "DBFactoryClass";
  15.         private static Config m_config;
  16.         private XmlDocument m_xmlDoc;
  17.         private XmlNode m_nodeConn;
  18.         private XmlNode m_nodeDbFacAss;
  19.         private XmlNode m_nodeDbFacCls;
  20.         private Type m_typeDbFac;
  21.         private Config()
  22.         {
  23.             m_xmlDoc = new XmlDocument();
  24.             try
  25.             {
  26.                 m_xmlDoc.Load(m_xmlDocPath);
  27.                 XmlNode root = m_xmlDoc.SelectSingleNode("config");
  28.                 m_nodeConn = root.SelectSingleNode(ConnNodeName);
  29.                 if (m_nodeConn == null) Logger.LogText("找不到配置节点:"+ConnNodeName);
  30.                 m_nodeDbFacAss = root.SelectSingleNode(DBFacAssNodeName);
  31.                 if (m_nodeDbFacAss == null) Logger.LogText("找不到配置节点:"+DBFacAssNodeName);
  32.                 m_nodeDbFacCls = root.SelectSingleNode(DBFacClsNodeName);
  33.                 if (m_nodeDbFacCls == null) Logger.LogText("找不到配置节点:" + DBFacClsNodeName);
  34.                 if (m_nodeConn == null || m_nodeDbFacAss == null || m_nodeDbFacCls == null) return;
  35.             }
  36.             catch (FileNotFoundException fe)
  37.             {
  38.                 Logger.LogText("无法读取配置文件,找不到配置文件:"+m_xmlDocPath);
  39.                 Logger.LogException(fe);
  40.             }
  41.             catch (Exception e)
  42.             {
  43.                 Logger.LogException(e);
  44.             }
  45.             try
  46.             {
  47.                 string path = AppDomain.CurrentDomain.BaseDirectory + m_nodeDbFacAss.InnerText;
  48.                 m_typeDbFac = Assembly.LoadFile(path).GetType(m_nodeDbFacCls.InnerText);
  49.                 if (m_typeDbFac == null) Logger.LogText("找不到数据库工厂类:" + m_nodeDbFacCls.InnerText);
  50.             }
  51.             catch (FileNotFoundException fe)
  52.             {
  53.                 Logger.LogText("找不到数据库工厂程序集:" + m_nodeDbFacAss.InnerText);
  54.                 Logger.LogException(fe);
  55.             }
  56.             catch (ReflectionTypeLoadException re)
  57.             {
  58.                 Logger.LogText("找不到数据库工厂类:"+m_nodeDbFacCls.InnerText);
  59.                 Logger.LogException(re);
  60.             }
  61.         }
  62.         /// <summary>
  63.         /// 获取 配置实例
  64.         /// </summary>
  65.         public static Config Instance
  66.         {
  67.             get
  68.             {
  69.                 if (m_config == null) m_config = new Config();
  70.                 return m_config;
  71.             }
  72.         }
  73.         /// <summary>
  74.         /// 获取 数据库连接字符串
  75.         /// </summary>
  76.         public string ConnenctionString
  77.         {
  78.             get
  79.             {
  80.                 if (m_nodeConn == null) return null;
  81.                 return m_nodeConn.InnerText;
  82.             }
  83.             set
  84.             {
  85.                 if (m_nodeConn == null) return;
  86.                 this.m_nodeConn.InnerText = value;
  87.             }
  88.         }
  89.         /// <summary>
  90.         /// 获取 数据库工厂实例
  91.         /// </summary>
  92.         public IDatabaseFactory DatabaseFactory
  93.         {
  94.             get
  95.             {
  96.                 return Activator.CreateInstance(m_typeDbFac) as IDatabaseFactory;
  97.             }
  98.         }
  99.         /// <summary>
  100.         /// 保存配置到磁盘
  101.         /// </summary>
  102.         /// <returns>保存是否成功</returns>
  103.         public bool Save()
  104.         {
  105.             try
  106.             {
  107.                 m_xmlDoc.Save(m_xmlDocPath);
  108.             }
  109.             catch (FileNotFoundException fe)
  110.             {
  111.                 Logger.LogText("无法保存配置文件,找不到配置文件:"+m_xmlDocPath);
  112.                 Logger.LogException(fe);
  113.                 return false;
  114.             }
  115.             catch (Exception e)
  116.             {
  117.                 Logger.LogException(e);
  118.                 return false;
  119.             }
  120.             return true;
  121.         }
  122.     }

Config.xml

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <config>
  3.   <!--数据库工厂类所在程序集-->
  4.   <DBFactoryAssembly>Database.dll</DBFactoryAssembly>
  5.   <!--数据库工厂类名-->
  6.   <DBFactoryClass>Database.OracleFactory</DBFactoryClass>
  7.   <!--数据库连接字符串-->
  8.   <ConnectionString>data source=fluxs_192.168.9.173;uid=yfzx;pwd=enjoyor;</ConnectionString>
  9. </config>