原位址:http://blog.csdn.net/pan_junbiao/article/details/12236419
C#反射擷取程式集資訊和通過類名建立類執行個體。
System.Reflection命名空間:包含通過檢查托管代碼中程式集、子產品、成員、參數和其他實體的中繼資料來檢索其相關資訊的類型。
Assembly 類:表示一個程式集,它是一個可重用、無版本沖突并且可自我描述的公共語言運作庫應用程式構造塊。

1、反射擷取程式集資訊
1.1 建立AssemblyResult.cs類,用于儲存結果
[csharp] view plaincopy
1. /// <summary>
2. /// 反射結果類
3. /// </summary>
4. public class AssemblyResult
5. {
6. /// <summary>
7. /// 程式集名稱
8. /// </summary>
9. public List<string> AssemblyName { get; set; }
10.
11. /// <summary>
12. /// 類名
13. /// </summary>
14. public List<string> ClassName { get; set; }
15.
16. /// <summary>
17. /// 類的屬性
18. /// </summary>
19. public List<string> Properties { get; set; }
20.
21. /// <summary>
22. /// 類的方法
23. /// </summary>
24. public List<string> Methods { get; set; }
25. }
1.2 建立AssemblyHandler.cs反射處理類
注意:要引用System.Reflection 命名空間。
[csharp] view plaincopy
1. using System;
2. using System.Collections.Generic;
3. using System.Linq;
4. using System.Text;
5. using System.Reflection;
6. using System.IO;
7.
8. namespace MyStudyFrom
9. {
10. /// <summary>
11. /// 反射處理類
12. /// </summary>
13. public class AssemblyHandler
14. {
15. string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/MyDLL/";
16.
17. /// <summary>
18. /// 擷取程式集名稱清單
19. /// </summary>
20. public AssemblyResult GetAssemblyName()
21. {
22. AssemblyResult result = new AssemblyResult();
23. string[] dicFileName = Directory.GetFileSystemEntries(path);
24. if(dicFileName!=null)
25. {
26. List<string> assemblyList = new List<string>();
27. foreach(string name in dicFileName)
28. {
29. assemblyList.Add(name.Substring(name.LastIndexOf('/') + 1));
30. }
31. result.AssemblyName = assemblyList;
32. }
33. return result;
34. }
35.
36. /// <summary>
37. /// 擷取程式集中的類名稱
38. /// </summary>
39. /// <param name="assemblyName">程式集</param>
40. public AssemblyResult GetClassName(string assemblyName)
41. {
42. AssemblyResult result = new AssemblyResult();
43. if (!String.IsNullOrEmpty(assemblyName))
44. {
45. assemblyName = path + assemblyName;
46. Assembly assembly = Assembly.LoadFrom(assemblyName);
47. Type[] ts = assembly.GetTypes();
48. List<string> classList = new List<string>();
49. foreach (Type t in ts)
50. {
51. //classList.Add(t.Name);
52. classList.Add(t.FullName);
53. }
54. result.ClassName = classList;
55. }
56. return result;
57. }
58.
59. /// <summary>
60. /// 擷取類的屬性、方法
61. /// </summary>
62. /// <param name="assemblyName">程式集</param>
63. /// <param name="className">類名</param>
64. public AssemblyResult GetClassInfo(string assemblyName, string className)
65. {
66. AssemblyResult result = new AssemblyResult();
67. if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
68. {
69. assemblyName = path + assemblyName;
70. Assembly assembly = Assembly.LoadFrom(assemblyName);
71. Type type = assembly.GetType(className,true,true);
72. if (type != null)
73. {
74. //類的屬性
75. List<string> propertieList = new List<string>();
76. PropertyInfo[] propertyinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
77. foreach (PropertyInfo p in propertyinfo)
78. {
79. propertieList.Add(p.ToString());
80. }
81. result.Properties = propertieList;
82.
83. //類的方法
84. List<string> methods = new List<string>();
85. MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
86. foreach (MethodInfo mi in methodInfos)
87. {
88. methods.Add(mi.Name);
89. //方法的參數
90. //foreach (ParameterInfo p in mi.GetParameters())
91. //{
92.
93. //}
94. //方法的傳回值
95. //string returnParameter = mi.ReturnParameter.ToString();
96. }
97. result.Methods = methods;
98. }
99. }
100. return result;
101. }
102. }
103. }
2、通過類名建立類執行個體
2.1、假設你要反射一個 DLL 中的類,并且沒有引用它(即未知的類型):
Assembly assembly =Assembly.LoadFile("程式集路徑,不能是相對路徑"); // 加載程式集(EXE 或 DLL)
object obj = assembly.CreateInstance("類的完全限定名(即包括命名空間)"); // 建立類的執行個體
2.2、若要反射目前項目中的類可以為:
Assembly assembly =Assembly.GetExecutingAssembly(); // 擷取目前程式集
object obj = assembly.CreateInstance("類的完全限定名(即包括命名空間)"); // 建立類的執行個體,傳回為 object 類型,需要強制類型轉換
2.3、也可以為:
Type type = Type.GetType("類的完全限定名");
object obj = type.Assembly.CreateInstance(type);
=======================================================
補充:
1)反射建立某個類的執行個體時,必須保證使用類的完全限定名(命名空間 + 類名)。Type.GetType 方法傳回 null 則意味搜尋中繼資料中的相關資訊失敗(反射失敗),請確定反射時使用類的完全限定名。
2)反射功能十分強大,沒有什麼不能實作的。若實作“跨程式集”,請使用第一種方法建立類的執行個體,并反射該執行個體的字段、屬性、方法、事件... 然後動态調用之。