貌似大多時候我們創建一個對象最終都是用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
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. 
16. private static
17. private
18. private
19. private
20. private
21. 
22. private
23. private
24.         {

25. new
26. try
27.             {

28.                 m_xmlDoc.Load(m_xmlDocPath);
29. "config");
30.                 m_nodeConn = root.SelectSingleNode(ConnNodeName);
31. if (m_nodeConn == null) Logger.LogText("找不到配置節點:"+ConnNodeName);
32.                 m_nodeDbFacAss = root.SelectSingleNode(DBFacAssNodeName);
33. if (m_nodeDbFacAss == null) Logger.LogText("找不到配置節點:"+DBFacAssNodeName);
34.                 m_nodeDbFacCls = root.SelectSingleNode(DBFacClsNodeName);
35. if (m_nodeDbFacCls == null) Logger.LogText("找不到配置節點:"
36. if (m_nodeConn == null || m_nodeDbFacAss == null || m_nodeDbFacCls == null) return;
37.             }
38. catch
39.             {

40. "無法讀取配置文件,找不到配置文件:"+m_xmlDocPath);
41.                 Logger.LogException(fe);
42.             }
43. catch
44.             {

45.                 Logger.LogException(e);
46.             }
47. try
48.             {

49. string
50.                 m_typeDbFac = Assembly.LoadFile(path).GetType(m_nodeDbFacCls.InnerText);
51. if (m_typeDbFac == null) Logger.LogText("找不到數據庫工廠類:"
52.             }
53. catch
54.             {

55. "找不到數據庫工廠程序集:"
56.                 Logger.LogException(fe);
57.             }
58. catch
59.             {

60. "找不到數據庫工廠類:"+m_nodeDbFacCls.InnerText);
61.                 Logger.LogException(re);
62.             }
63.         }
64. 
65. /// <summary>
66. /// 獲取 配置實例
67. /// </summary>
68. public static
69.         {

70. get
71.             {

72. if (m_config == null) m_config = new
73. return
74.             }
75.         }
76. 
77. /// <summary>
78. /// 獲取 數據庫連接字符串
79. /// </summary>
80. public string
81.         {

82. get
83.             {

84. if (m_nodeConn == null) return null;
85. return
86.             }
87. set
88.             {

89. if (m_nodeConn == null) return;
90. this.m_nodeConn.InnerText = value;
91.             }
92.         }
93. /// <summary>
94. /// 獲取 數據庫工廠實例
95. /// </summary>
96. public
97.         {

98. get
99.             {

100. return Activator.CreateInstance(m_typeDbFac) as
101.             }
102.         }
103. /// <summary>
104. /// 保存配置到磁盤
105. /// </summary>
106. /// <returns>保存是否成功</returns>
107. public bool
108.         {

109. try
110.             {

111.                 m_xmlDoc.Save(m_xmlDocPath);
112.             }
113. catch
114.             {

115. "無法保存配置文件,找不到配置文件:"+m_xmlDocPath);
116.                 Logger.LogException(fe);
117. return false;
118.             }
119. catch
120.             {

121.                 Logger.LogException(e);
122. return false;
123.             }
124. return true;
125.         }
126.     }

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>
    10.