貌似大多時候我們創建一個對象最終都是用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.