天天看點

C#反射 擷取程式集資訊和通過類名建立類執行個體

原位址:http://blog.csdn.net/pan_junbiao/article/details/12236419

C#反射擷取程式集資訊和通過類名建立類執行個體。

System.Reflection命名空間:包含通過檢查托管代碼中程式集、子產品、成員、參數和其他實體的中繼資料來檢索其相關資訊的類型。

Assembly 類:表示一個程式集,它是一個可重用、無版本沖突并且可自我描述的公共語言運作庫應用程式構造塊。

C#反射 擷取程式集資訊和通過類名建立類執行個體

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)反射功能十分強大,沒有什麼不能實作的。若實作“跨程式集”,請使用第一種方法建立類的執行個體,并反射該執行個體的字段、屬性、方法、事件... 然後動态調用之。

c#