反射用到的命名空间: System.Reflection
- System.Type
- System.Reflection.Assembly
反射用到的主要类:
System.Type 类 -- 通过这个类可以访问任何给定数据类型的信息.
System.Reflection.Assembly 类 -- 它可以用于访问给定程序集的信息, 或者把这个程序集加载到程序中.
System.Type 类:
System.Type 类对于反射起着核心的作用. 但它是一个抽象的基类, Type 有与每种数据类型对应的派生类, 我们使用这个派生类的对象的方法, 字段, 属性来查找有关该类型的所有信息.
获取给定类型的 Type 引用有 3 种常用方式:
●使用 C# typeof 运算符.
Type t = typeof(string);
●使用对象 GetType()方法.
- string s = "grayworm";
- Type t = s.GetType();
●还可以调用 Type 类的静态方法 GetType().
Type t = Type.GetType("System.String");
上面这三类代码都是获取 string 类型的 Type, 在取出 string 类型的 Type 引用 t 后, 我们就可以通过 t 来探测 string 类型的结构了.
- string n = "grayworm";
- Type t = n.GetType();
- foreach (MemberInfo mi in t.GetMembers())
- {
- Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name);
- }
Type 类的属性: Name 数据类型名
FullName 数据类型的完全限定名(包括命名空间名)
Namespace 定义数据类型的命名空间名
IsAbstract 指示该类型是否是抽象类型
IsArray 指示该类型是否是数组
IsClass 指示该类型是否是类
IsEnum 指示该类型是否是枚举
IsInterface 指示该类型是否是接口
IsPublic 指示该类型是否是公有的
IsSealed 指示该类型是否是密封类
IsValueType 指示该类型是否是值类型
Type 类的方法: GetConstructor(), GetConstructors(): 返回 ConstructorInfo 类型, 用于取得该类的构造函数的信息
GetEvent(), GetEvents(): 返回 EventInfo 类型, 用于取得该类的事件的信息
GetField(), GetFields(): 返回 FieldInfo 类型, 用于取得该类的字段 (成员变量) 的信息
GetInterface(), GetInterfaces(): 返回 InterfaceInfo 类型, 用于取得该类实现的接口的信息
GetMember(), GetMembers(): 返回 MemberInfo 类型, 用于取得该类的所有成员的信息
GetMethod(), GetMethods(): 返回 MethodInfo 类型, 用于取得该类的方法的信息
GetProperty(), GetProperties(): 返回 PropertyInfo 类型, 用于取得该类的属性的信息
可以调用这些成员, 其方式是调用 Type 的 InvokeMember()方法, 或者调用 MethodInfo, PropertyInfo 和其他类的 Invoke()方法.
查看类中的构造方法:
- NewClassw nc = new NewClassw();
- Type t = nc.GetType(); ConstructorInfo[] ci = t.GetConstructors(); // 获取类的所有构造函数
- foreach (ConstructorInfo c in ci) // 遍历每一个构造函数
- {
- ParameterInfo[] ps = c.GetParameters(); // 取出每个构造函数的所有参数
- foreach (ParameterInfo pi in ps) // 遍历并打印所该构造函数的所有参数
- {
- Console.Write(pi.ParameterType.ToString()+""+pi.Name+",");
- }
- Console.WriteLine();
- }
用构造函数动态生成对象: Type t = typeof(NewClassw);
- Type[] pt = new Type[2]; pt[0] = typeof(string);
- pt[1] = typeof(string);
- // 根据参数类型获取构造函数
- ConstructorInfo ci = t.GetConstructor(pt); // 构造 Object 数组, 作为构造函数的输入参数
- object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};
- // 调用构造函数生成对象
- object o = ci.Invoke(obj); // 调用生成的对象的方法测试是否对象生成成功
- //((NewClassw)o).show();
用 Activator 生成对象: Type t = typeof(NewClassw);
- // 构造函数的参数
- object[] obj = new object[2] { "grayworm", "hi.baidu.com/grayworm" };
- // 用 Activator 的 CreateInstance 静态方法, 生成新对象
- object o = Activator.CreateInstance(t,"grayworm","hi.baidu.com/grayworm"); //((NewClassw)o).show();
查看类中的属性: NewClassw nc = new NewClassw();
- Type t = nc.GetType();
- PropertyInfo[] pis = t.GetProperties(); foreach(PropertyInfo pi in pis)
- {
- Console.WriteLine(pi.Name);
- }
查看类中的 public 方法: NewClassw nc = new NewClassw();
- Type t = nc.GetType();
- MethodInfo[] mis = t.GetMethods(); foreach (MethodInfo mi in mis)
- {
- Console.WriteLine(mi.ReturnType+" "+mi.Name);
- }
查看类中的 public 字段 NewClassw nc = new NewClassw();
- Type t = nc.GetType();
- FieldInfo[] fis = t.GetFields();
- foreach (FieldInfo fi in fis)
- {
- Console.WriteLine(fi.Name);
- } ( http://hi.baidu.com/grayworm )
用反射生成对象, 并调用属性, 方法和字段进行操作 NewClassw nc = new NewClassw();
- Type t = nc.GetType();
- object obj = Activator.CreateInstance(t);
- // 取得 ID 字段
- FieldInfo fi = t.GetField("ID");
- // 给 ID 字段赋值
- fi.SetValue(obj, "k001");
- // 取得 MyName 属性
- PropertyInfo pi1 = t.GetProperty("MyName");
- // 给 MyName 属性赋值
- pi1.SetValue(obj, "grayworm", null);
- PropertyInfo pi2 = t.GetProperty("MyInfo");
- pi2.SetValue(obj, "hi.baidu.com/grayworm", null);
- // 取得 show 方法
- MethodInfo mi = t.GetMethod("show");
- // 调用 show 方法
- mi.Invoke(obj, null);
System.Reflection.Assembly 类
Assembly 类可以获得程序集的信息, 也可以动态的加载程序集, 以及在程序集中查找类型信息, 并创建该类型的实例.
使用 Assembly 类可以降低程序集之间的耦合, 有利于软件结构的合理化.
通过程序集名称返回 Assembly 对象
Assembly ass = Assembly.Load("ClassLibrary831");
通过 DLL 文件名称返回 Assembly 对象
Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
通过 Assembly 获取程序集中类
Type t = ass.GetType("ClassLibrary831.NewClass"); // 参数必须是类的全名
通过 Assembly 获取程序集中所有的类
- Type[] t = ass.GetTypes();
- // 通过程序集的名称反射 Assembly ass = Assembly.Load("ClassLibrary831");
- Type t = ass.GetType("ClassLibrary831.NewClass"); object o = Activator.CreateInstance(t, "grayworm", "http://hi.baidu.com/grayworm");
- MethodInfo mi = t.GetMethod("show");
- mi.Invoke(o, null);
来源: http://www.bubuko.com/infodetail-2968460.html