反射,特性-C#

反射

在了解反射前,首先要了解我们写的代码是通过了什么流程使机器能够读懂的.

我们写的C#代码首先经过第一次编译变成中间语言(CIL),中间语言再经过编译才会变成机器语言.那为什么会有中间语言这道步骤?首先,我们也知道C#提供了很多简写语法,这些简写就像黑话一样,不懂的人怎么知道你在说什么?所以要有第一道编译把他编译成大家都普遍使用的语言,也就是中间语言.其次,你的代码可能要放到很多平台上使用,不仅是PC,还有单片机,游戏机等平台,为那些平台服务而编译出来的机器码各有不同.基于这两个(很不严谨)的理由就需要一个中间语言.

中间语言包含代码以及元数据(metadata).一个类封不封闭,有多少属性,什么方法,方法体是什么,这些都是元数据.而反射就是拿到元数据,并通过元数据来访问里面的属性,实例化,调用里面的方法等操作.

因为元数据是编译之后才能生成的数据,所以反射的很多参数都是字符串,字符串的内容可能就是某处的类或者某处的方法,.这样子他们才能在运行时实时操作,而脱离IDE的语法规定.

给一个游戏制作插件就是反射的一个使用场景.例如一个unity游戏,尽管你可以通过dnspy反编译里面的各种dll来查看代码,但是你还是不能直接访问或者修改代码.但是同时想要扩展功能,该怎么办?反射就可以办到,通过读取类的元数据,就可以调用引擎里的各种办法

特性

特性就是向程序添加元数据,就好像你给一串代码用隐形墨水写字,用紫光灯才能看到你写的什么字.你给代码写字本身是不会对运行起任何作用的,只有通过特殊手段侦测到你有这个特性,我才能干相应的事情.这里的特殊手段就是指反射.因为特性是在给代码添加元数据,所以只有反射才能做到与元数据的操作.

我们可以自定义一个属性.自定义属性要求直接或间接从System.Attribute类派生

class MyAttribute : Attribute {}

想要使用MyAttribute这个属性可以在直接在代码前加上这句

[My]

或者

[MyAttribute]

这两者是一样的.但是第一个是简写.如果在命名你的自定义属性时后面跟了个Attribute那么在使用这个属性的时候Attribute可以不写.这是个语法糖.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值