C#反射 获取程序集信息和通过类名创建类实例

原地址:http://blog.youkuaiyun.com/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 { getset; }  

10.   

11.     /// <summary>  

12.     /// 类名  

13.     /// </summary>  

14.     public List<string> ClassName { getset; }  

15.   

16.     /// <summary>  

17.     /// 类的属性  

18.     /// </summary>  

19.     public List<string> Properties { getset; }  

20.   

21.     /// <summary>  

22.     /// 类的方法  

23.     /// </summary>  

24.     public List<string> Methods { getset; }  

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
)反射功能十分强大,没有什么不能实现的。若实现跨程序集,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件... 然后动态调用之。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值