学习反射遇到的疑问,请帮忙解答一下

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

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

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

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

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

忘各位能给解析一下。

...全文
149 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
裸奔的蜗牛 2012-06-14
  • 打赏
  • 举报
回复
反射是 通过Type类来获取相关类型的信息,并不包含该属性的值,他的主要作用是动态的创建对象;
元素据的其中一部分描述了程序中定义的所有类型及其成员相关的信息(数据),并不包含他属性的具体值;
试想下,你的系统创建了10W个对象,元数据只是记录他的结构,对未知的对象他也无能为力。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我理解的应该不对。。

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

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

户口本的例子不太合适。

Type类记录的只是类的信息,请注意,是“类”的信息。所以它会知道其所在命名空间,类名、有哪些字段、属性、方法等成员信息。

而你所想不清楚的属性的具体的值,那不是类的信息,不是类的组成部分,那是类的实例----对象的内容。这些东西会存在于编绎过后的IL代码中,但是在这个对象的IL代码中,跟类的IL代码没有任何关系。
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
我理解的应该不对。。

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

但是属性的值 以及方法中变量的值 在编译过后,是在IL代码中吗?
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
就说户口本 里面有自己的基本信息,那这个基本信息 无非是姓名 和户主关系 兄弟姐妹等信息

这时不是应该把 姓名看做属性,而这个名字的值不也是被记录了吗

姓名:张三
bwangel 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:
规定的格式就是用Type类型的变量来记录class的信息,这些信息包括:class的命名空间,所属assembly,有哪些属性,属性的类型,构造函数,其他函数。。。。。

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


我刚才试了一下,这个Type类型的对象 对于对应类的字段或者属性的值 也进行了记录吧,如果有赋值则如实记录,没有赋值 记录 各个类型对应的默认……
[/Quote]
怎么可能记录属性值呢?你家里的户口本记录了你的基本信息,但它会记录你脑袋里在想什么吗?

属性的值是系统为每个对象单独分配的内存空间记录的。
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
上面说的 都好像 和 元素据没有关系?
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
规定的格式就是用Type类型的变量来记录class的信息,这些信息包括:class的命名空间,所属assembly,有哪些属性,属性的类型,构造函数,其他函数。。。。。

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

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

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

说白了,就是用系统设定的一个类来描述其他类。
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
写程序时 通过加载一个程序集 然后 GetTypes() 就能获得这个程序集中所有的Type类型的对象
然后 通过每个Type对象能获得对应类的各个成员。从表面看 好像没有元素据的影子(脑子里想不到)
吾非大神 2012-06-13
  • 打赏
  • 举报
回复
好像又多明白了一些,但脑子里总感觉有些东西抓不住

showlie 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
书上讲:
程序集里包含了 元数据 和 编译过的代码(IL代码)等,而元素据的其中一部分 描述了程序中定义的所有类型及其成员相关的信息(数据)。
这里所说的相关信息包含 写代码时给变量或者对象属性赋的初值吗?
比如 Person p = new Person(); p.Name="张三";
编译之后,元数据里有person类型的相关信息,比如有几个字段、几个属性、几个方法、是否继承了其他……
[/Quote]

看书看得仔细,这一点值得肯定,但是看书时也要思考。书已经写的很清楚了“描述了程序中定义的所有类型及其成员相关的信息(数据)”,属性值是属于类型或成员的信息吗?很明显不是嘛!
反射,是通过类名获得类信息,通过类信息来创建类对象。除非类信息中包含了常量成员变量,那该常量也是类信息的一部分。外部赋值的属性值就不是了。
bwangel 2012-06-13
  • 打赏
  • 举报
回复
Type类本身也是一个类类型。只不过它的作用是记录其他类的特征信息。
怎么说呢,
Type类就象是家里的户口本,记录家庭成员的信息,但户口本本身也是一个类。

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧