【正文】
①什么是反射?
反射提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例(见④ ),将类型绑定到现有对象(这个不会),或从现有对象中获取类型(见②③ )。然后,可以调用类型的方法或访问其字段和属性。
最最简单的反射:如下
输出结果:
TestReflection.AX
TestReflection.AXzhz
【分析】通过对象实例(A,B),可以使用GetType()方法获取该对象属于哪个类.非类型转化后的类,而是构造该类型的类
【应用】给个变量/对象实例,测试下它属于哪个类,顺带还给出该类所属的Assembly
【附】另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
Type t = Type.GetType("TestReflection.AX");
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件
Type类:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。 发晕,对泛型没研究.
②我们获得的Type实例有什么用?
ⅰ获得类名:如上面例子的FullName属性,返回TestReflection.AX
这个也比较恶心,直接用A.ToString();返回的也是这个结果.
ⅱ创建该类的对象.你首先通过ⅰ来获得类名AX
AX ax = (AX)Activator.CreateInstance(tpA);
都知道是AX类型了,怎么不new一个???鸡肋的东西.
上面的【附】真不知道是干嘛吃的,都知道了类TestReflection.AX,直接new一个就可以了.
ⅲ获得对象所属类的相关信息
通过tpA的相关属性,来得到该类的相关信息.
其实你通过A的相关属性,也可以得到该类的相关信息.还简单省事,真不知道Type类到底是干嘛吃的.
③窥一斑而知全豹,一个对象实例泄漏的密秘(这个比较爽)
通过一个对象实例,我们可以获得包含这个对象实例的类的Assembly,进而获得整个Assembly的信息.
【注】通过测试,发现只能获得public类型的信息.
①什么是反射?
反射提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例(见④ ),将类型绑定到现有对象(这个不会),或从现有对象中获取类型(见②③ )。然后,可以调用类型的方法或访问其字段和属性。
最最简单的反射:如下
1using System;
2using System.Reflection;
3namespace TestReflection
4{
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 //创建两个对象【object和Objetct好像没有区别啊??连提示都一样!】
10 object A = new AX();
11 Object B = new AXzhz();
12 //获取对象的类型
13 new TestObjectType().TestObjectTypeNow(A, B);
14 }
15 }
16
17 class AX
18 {
19 }
20
21 class AXzhz
22 {
23 }
24
25 class TestObjectType
26 {
27 //构造函数的默认修饰为private
28 internal void TestObjectTypeNow(object A, object B)
29 {
30 Type tpA = A.GetType();
31 Type tpB = B.GetType();
32 Console.WriteLine(tpA.FullName);
33 Console.WriteLine(tpB.FullName);
34 Console.ReadLine();
35 }
36 }
37}
2using System.Reflection;
3namespace TestReflection
4{
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 //创建两个对象【object和Objetct好像没有区别啊??连提示都一样!】
10 object A = new AX();
11 Object B = new AXzhz();
12 //获取对象的类型
13 new TestObjectType().TestObjectTypeNow(A, B);
14 }
15 }
16
17 class AX
18 {
19 }
20
21 class AXzhz
22 {
23 }
24
25 class TestObjectType
26 {
27 //构造函数的默认修饰为private
28 internal void TestObjectTypeNow(object A, object B)
29 {
30 Type tpA = A.GetType();
31 Type tpB = B.GetType();
32 Console.WriteLine(tpA.FullName);
33 Console.WriteLine(tpB.FullName);
34 Console.ReadLine();
35 }
36 }
37}
输出结果:
TestReflection.AX
TestReflection.AXzhz
【分析】通过对象实例(A,B),可以使用GetType()方法获取该对象属于哪个类.非类型转化后的类,而是构造该类型的类
【应用】给个变量/对象实例,测试下它属于哪个类,顺带还给出该类所属的Assembly
【附】另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
Type t = Type.GetType("TestReflection.AX");
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件
Type类:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。 发晕,对泛型没研究.
②我们获得的Type实例有什么用?
ⅰ获得类名:如上面例子的FullName属性,返回TestReflection.AX
这个也比较恶心,直接用A.ToString();返回的也是这个结果.
ⅱ创建该类的对象.你首先通过ⅰ来获得类名AX
AX ax = (AX)Activator.CreateInstance(tpA);
都知道是AX类型了,怎么不new一个???鸡肋的东西.
上面的【附】真不知道是干嘛吃的,都知道了类TestReflection.AX,直接new一个就可以了.
ⅲ获得对象所属类的相关信息
通过tpA的相关属性,来得到该类的相关信息.
其实你通过A的相关属性,也可以得到该类的相关信息.还简单省事,真不知道Type类到底是干嘛吃的.
③窥一斑而知全豹,一个对象实例泄漏的密秘(这个比较爽)
通过一个对象实例,我们可以获得包含这个对象实例的类的Assembly,进而获得整个Assembly的信息.
1using System;
2using System.Reflection;
3namespace TestReflection
4{
5 class Program
6 {
7 public static void Main(string[] args)
8 {
9 object A = new AX();
10 //获取对象所属的Assembly的所有类的基本信息
11 new TestObjectType().TestObjectTypeNow(A);
12 }
13 }
14
15 class AX
16 {
17 internal int kkkkkkkk = 0;
18 public int ooooooooo;
19 private int property;
20
21 public int Property
22 {
23 get { return property; }
24 set { property = value; }
25 }
26 public void A()
27 {
28 Console.WriteLine("AX's function!~");
29 }
30 }
31
32 class AXzhz
33 {
34 }
35
36 class TestObjectType
37 {
38 //构造函数的默认修饰为private
39 internal void TestObjectTypeNow(object A)
40 {
41 Type tpA = A.GetType();
42 Assembly assembly = tpA.Assembly;
43 Type[] types = assembly.GetTypes();
44 foreach (Type type in types)
45 {
46 Console.WriteLine("【类名】"+type.FullName);
47 //获取类型的结构信息
48 ConstructorInfo[] myconstructors = type.GetConstructors();
49 Show(myconstructors);
50 //获取类型的字段信息
51 FieldInfo[] myfields = type.GetFields();
52 Show(myfields);
53 //获取方法信息
54 MethodInfo[] myMethodInfo = type.GetMethods();
55 Show(myMethodInfo);
56 //获取属性信息
57 PropertyInfo[] myproperties = type.GetProperties();
58 Show(myproperties);
59 //获取事件信息,这个项目没有事件,所以注释掉了,
60 //通过这种办法,还可以获得更多的type相关信息.
61 //EventInfo[] Myevents = type.GetEvents();
62 //Show(Myevents);
63 }
64 Console.ReadLine();
65 }
66 //显示数组的基本信息
67 public void Show(object[] os)
68 {
69 foreach (object var in os)
70 {
71 Console.WriteLine(var.ToString());
72 }
73 Console.WriteLine("----------------------------------");
74 }
75 }
76}
2using System.Reflection;
3namespace TestReflection
4{
5 class Program
6 {
7 public static void Main(string[] args)
8 {
9 object A = new AX();
10 //获取对象所属的Assembly的所有类的基本信息
11 new TestObjectType().TestObjectTypeNow(A);
12 }
13 }
14
15 class AX
16 {
17 internal int kkkkkkkk = 0;
18 public int ooooooooo;
19 private int property;
20
21 public int Property
22 {
23 get { return property; }
24 set { property = value; }
25 }
26 public void A()
27 {
28 Console.WriteLine("AX's function!~");
29 }
30 }
31
32 class AXzhz
33 {
34 }
35
36 class TestObjectType
37 {
38 //构造函数的默认修饰为private
39 internal void TestObjectTypeNow(object A)
40 {
41 Type tpA = A.GetType();
42 Assembly assembly = tpA.Assembly;
43 Type[] types = assembly.GetTypes();
44 foreach (Type type in types)
45 {
46 Console.WriteLine("【类名】"+type.FullName);
47 //获取类型的结构信息
48 ConstructorInfo[] myconstructors = type.GetConstructors();
49 Show(myconstructors);
50 //获取类型的字段信息
51 FieldInfo[] myfields = type.GetFields();
52 Show(myfields);
53 //获取方法信息
54 MethodInfo[] myMethodInfo = type.GetMethods();
55 Show(myMethodInfo);
56 //获取属性信息
57 PropertyInfo[] myproperties = type.GetProperties();
58 Show(myproperties);
59 //获取事件信息,这个项目没有事件,所以注释掉了,
60 //通过这种办法,还可以获得更多的type相关信息.
61 //EventInfo[] Myevents = type.GetEvents();
62 //Show(Myevents);
63 }
64 Console.ReadLine();
65 }
66 //显示数组的基本信息
67 public void Show(object[] os)
68 {
69 foreach (object var in os)
70 {
71 Console.WriteLine(var.ToString());
72 }
73 Console.WriteLine("----------------------------------");
74 }
75 }
76}
【注】通过测试,发现只能获得public类型的信息.