貌似大多时候我们创建一个对象最终都是用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
Config.xml
反射允许我们动态的加载类,也就是说完全可以在配置文件里决定究竟要选用哪个类
这样,就可以把数据库工厂,皮肤等写成类放在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
- // Coding by nyzhl
- /// <summary>
- /// 应用程序配置类
- /// </summary>
- public class Config
- {
- //配置文件路径
- private readonly string m_xmlDocPath = @"Config.xml";
- //数据库连接节点名
- private readonly string ConnNodeName = "ConnectionString";
- //数据库工厂程序集名
- private readonly string DBFacAssNodeName = "DBFactoryAssembly";
- //数据库工厂类名
- private readonly string DBFacClsNodeName = "DBFactoryClass";
- private static Config m_config;
- private XmlDocument m_xmlDoc;
- private XmlNode m_nodeConn;
- private XmlNode m_nodeDbFacAss;
- private XmlNode m_nodeDbFacCls;
- private Type m_typeDbFac;
- private Config()
- {
- m_xmlDoc = new XmlDocument();
- try
- {
- m_xmlDoc.Load(m_xmlDocPath);
- XmlNode root = m_xmlDoc.SelectSingleNode("config");
- m_nodeConn = root.SelectSingleNode(ConnNodeName);
- if (m_nodeConn == null) Logger.LogText("找不到配置节点:"+ConnNodeName);
- m_nodeDbFacAss = root.SelectSingleNode(DBFacAssNodeName);
- if (m_nodeDbFacAss == null) Logger.LogText("找不到配置节点:"+DBFacAssNodeName);
- m_nodeDbFacCls = root.SelectSingleNode(DBFacClsNodeName);
- if (m_nodeDbFacCls == null) Logger.LogText("找不到配置节点:" + DBFacClsNodeName);
- if (m_nodeConn == null || m_nodeDbFacAss == null || m_nodeDbFacCls == null) return;
- }
- catch (FileNotFoundException fe)
- {
- Logger.LogText("无法读取配置文件,找不到配置文件:"+m_xmlDocPath);
- Logger.LogException(fe);
- }
- catch (Exception e)
- {
- Logger.LogException(e);
- }
- try
- {
- string path = AppDomain.CurrentDomain.BaseDirectory + m_nodeDbFacAss.InnerText;
- m_typeDbFac = Assembly.LoadFile(path).GetType(m_nodeDbFacCls.InnerText);
- if (m_typeDbFac == null) Logger.LogText("找不到数据库工厂类:" + m_nodeDbFacCls.InnerText);
- }
- catch (FileNotFoundException fe)
- {
- Logger.LogText("找不到数据库工厂程序集:" + m_nodeDbFacAss.InnerText);
- Logger.LogException(fe);
- }
- catch (ReflectionTypeLoadException re)
- {
- Logger.LogText("找不到数据库工厂类:"+m_nodeDbFacCls.InnerText);
- Logger.LogException(re);
- }
- }
- /// <summary>
- /// 获取 配置实例
- /// </summary>
- public static Config Instance
- {
- get
- {
- if (m_config == null) m_config = new Config();
- return m_config;
- }
- }
- /// <summary>
- /// 获取 数据库连接字符串
- /// </summary>
- public string ConnenctionString
- {
- get
- {
- if (m_nodeConn == null) return null;
- return m_nodeConn.InnerText;
- }
- set
- {
- if (m_nodeConn == null) return;
- this.m_nodeConn.InnerText = value;
- }
- }
- /// <summary>
- /// 获取 数据库工厂实例
- /// </summary>
- public IDatabaseFactory DatabaseFactory
- {
- get
- {
- return Activator.CreateInstance(m_typeDbFac) as IDatabaseFactory;
- }
- }
- /// <summary>
- /// 保存配置到磁盘
- /// </summary>
- /// <returns>保存是否成功</returns>
- public bool Save()
- {
- try
- {
- m_xmlDoc.Save(m_xmlDocPath);
- }
- catch (FileNotFoundException fe)
- {
- Logger.LogText("无法保存配置文件,找不到配置文件:"+m_xmlDocPath);
- Logger.LogException(fe);
- return false;
- }
- catch (Exception e)
- {
- Logger.LogException(e);
- return false;
- }
- return true;
- }
- }
- <?xml version="1.0" encoding="utf-8" ?>
- <config>
- <!--数据库工厂类所在程序集-->
- <DBFactoryAssembly>Database.dll</DBFactoryAssembly>
- <!--数据库工厂类名-->
- <DBFactoryClass>Database.OracleFactory</DBFactoryClass>
- <!--数据库连接字符串-->
- <ConnectionString>data source=fluxs_192.168.9.173;uid=yfzx;pwd=enjoyor;</ConnectionString>
- </config>