首先,我们需要知道type,type是类型的类型(笑
官方点的说法是,BCL声明了一个Type抽象类,它被设计用来包含类型的特性,
使用这个类的对象(抽象类的对象?这显然是错误的,但是这里用的其实是Type的派生类的对象)能让我们获得程序使用的类型的信息,
对于程序用到的每一个类型,CLR都会创建一个包含这个类信息的Type类(其实是Type类的派生类)的对象。
就是你用到的每一个类,都有一个记录类信息的元数据(metadata),是Type类(Type抽象类的一个具体类RuntimeType类)的实例,typeof(你想洞察的类)就是得到 你想洞察的类的元数据。
得到type有两种方式
方式1:
方式2:无需实例对象a直接写
var type1 = typeof(A);
两种方式的得到的type1和type2这两个引用是一样的,因为都是对A这个类获得其type
我们能通过type1得到什么呢?
(这只是显示的一部分,还有很多东西没有显示出来)
返回成员:
GetMember():GetMember是单数,单数就是你要指定一个名字,才能返回
GetMembers():GetMembers是复数,用于取得该类的所有成员的信息
返回方法:
GetMethod():GetMethod是单数,单数就是你要指定一个名字,才能返回
GetMethods():GetMethods是复数,用于取得该类的所有方法的信息
下面的同理...
返回内嵌类型:
返回属性:
等等...
你拿到这些东西(属性,方法)后还可以调用它!
调用属性举例:
注意这里var的类型是PropertyInfo,里面一定包含了大量的东西!
10.png)
我们可以直接用Property.的方式,调用get方法和set方法了。
SetValue([我希望对a操作,a是A类的实例],[赋值的string是aaa],[忽略第三个参数给null即可] );
以上关键代码翻译:
var type1 = typeof(A);
//创建一个Type类的type1“引用”到A类的元数据(也就是type实例,创建A类时就存在了),
var Property = type1.GetProperty("MyProperty");
//通过type1“引用”到A类的元数据(type对象)并且拿到A类中一个叫MyProperty的属性,用Property 来“引用”MyProperty的属性
var a = new A();
//创建一个A类型的实例a
Property.SetValue(a, "aaa", null);
//通过Property“引用到”MyProperty属性,并给a这个实例的MyProperty属性,赋值"aaa"。
这其实相当于绕了一个圈完成了
var a = new A();
a.MyProperty = "aaa";
而且通过反射还可以重写a.MyProperty的值。(原a.MyProperty = "bbb",通过反射改为"aaa")
调用方法举例:
与属性的类似
这里出现了Invoke方法,这个方法类似与属性部分的SetValue();是给方法Function()赋值用的。
Invoke(object obj, object[] paramenters) ;
第一个位置是obj也就是我们要传入的A类型实例a,
第二个位置很奇怪,是个object[],怎么传输呢?
这样写:
function.Invoke(a, new object[] {1});
new一个object加[]然后在{}里写入对应类型的值即可。