日期:2014-05-18  浏览次数:20707 次

学习反射遇到的疑问,请帮忙解答一下
书上讲:
程序集里包含了 元数据 和 编译过的代码(IL代码)等,而元素据的其中一部分 描述了程序中定义的所有类型及其成员相关的信息(数据)。
这里所说的相关信息包含 写代码时给变量或者对象属性赋的初值吗?
比如 Person p = new Person(); p.Name="张三"; 
编译之后,元数据里有person类型的相关信息,比如有几个字段、几个属性、几个方法、是否继承了其他类、是否实现了某个接口等,但这个 Name属性的值 被记录到哪里去了呢?包含在IL代码中?

继续看书:
这时候出现了一个 Type类,被设计用来包含类型的特性,使用这个类的对象能获取程序使用的类型的信息。对于程序中的每一个类型,clr都会实例化Type类型的对象。

这里又出现了一个类型的信息,和元素据描述的相关类型的信息 这两个是该关联起来看,还是区分来看?

反射是 通过Type类来获取相关类型的信息,并且获得该类型的属性后,还能获得 属性值?

我试着把它们结合起来理解,可出现了上面几处辨不清的地方。

忘各位能给解析一下。



------解决方案--------------------
Type类本身也是一个类类型。只不过它的作用是记录其他类的特征信息。
怎么说呢,
Type类就象是家里的户口本,记录家庭成员的信息,但户口本本身也是一个类。
------解决方案--------------------
探讨
书上讲:
程序集里包含了 元数据 和 编译过的代码(IL代码)等,而元素据的其中一部分 描述了程序中定义的所有类型及其成员相关的信息(数据)。
这里所说的相关信息包含 写代码时给变量或者对象属性赋的初值吗?
比如 Person p = new Person(); p.Name="张三";
编译之后,元数据里有person类型的相关信息,比如有几个字段、几个属性、几个方法、是否继承了其他……

------解决方案--------------------
n个人编程,就可能创建n个类class,那么。net需要记住这些类的信息,虽然class的内容千差万别,但是我们记录的格式却不能随意,规定的格式就是用Type类型的变量来记录class的信息,这些信息包括:class的命名空间,所属assembly,有哪些属性,属性的类型,构造函数,其他函数。。。。。

说白了,就是用系统设定的一个类来描述其他类。
------解决方案--------------------
探讨
引用:
规定的格式就是用Type类型的变量来记录class的信息,这些信息包括:class的命名空间,所属assembly,有哪些属性,属性的类型,构造函数,其他函数。。。。。

说白了,就是用系统设定的一个类来描述其他类。


我刚才试了一下,这个Type类型的对象 对于对应类的字段或者属性的值 也进行了记录吧,如果有赋值则如实记录,没有赋值 记录 各个类型对应的默认……

------解决方案--------------------
探讨

我理解的应该不对。。

Type类只是关联类型的结构信息 所在命名空间、类名、字段、属性、方法

但是属性的值 以及方法中变量的值 在编译过后,是在IL代码中吗?

------解决方案--------------------
反射是 通过Type类来获取相关类型的信息,并不包含该属性的值,他的主要作用是动态的创建对象;
元素据的其中一部分描述了程序中定义的所有类型及其成员相关的信息(数据),并不包含他属性的具体值;
试想下,你的系统创建了10W个对象,元数据只是记录他的结构,对未知的对象他也无能为力。