C#反射入门记录

    今天简单记录一下反射的一小点入门知识。

    首先是定义,我们平时写的C#代码通过编译后会生成dll或exe文件,这种文件的内部会包含一些程序的元数据,元数据包括有该生成文件的一些说明,例如名称、版本等等信息,实现的接口信息,基类,成员等等,还有之前有说到的通过特性添加来的一些信息。我们通过反射就可以获取这些信息。其实感觉反射就是通过表象找“本质”的一种操作,通过表面信息发现内在信息的一种手法。

    今天也只是学了一点,所以这里就简单记录两个内容。一个就是反射常用的一个类:Type,一个就是使用反射,去实现一下之间文章中写到的,获取特性的信息。学习反射其实也就是学习一些类和方法。

①Type类

    这个类其实就是反射中常用来获取元数据的类,这个类是被abstract修饰的,所以不能被实例化,使用这个类需要学习几个简单的函数。

首先是获取元数据的函数:

上面第二行到第四行这三个方法均可获取Teacher的元数据。

使用上面获取的3个type变量,就可以获取Teacher类的一些元数据。

例如类名、类所在命名空间等等。

几个获取内容函数:

这几个函数就可分别获取类的字段、方法和属性。

获取到这些内容后,就可以使用GetCustomAttributes来获取相应的特性,进而获取特性具体信息。这里简单列一下,第二部分会用到这几个函数。

②获取特性的信息

    首先先获取一下相关类上添加的特性名。下面放一部分代码,差不多可以知道是什么意思,第二个例子会放完整代码。

定义的特性:

使用该特性的类:

主函数:

    这段代码使用了typeof(Teacher)来获取Teacher类型的元数据,然后将其赋值给了AttributeTest变量,MemberInfo类型表示在.NET中的成员,如字段、方法、属性等。

GetCustomAttributes 是一个方法,用于获取应用于指定类型的自定义特性,其返回值是object[]。最后遍历一下该数组,将值打印出来。

最终显示:

其中attribute_learning为命名空间名称。还有一点,这里用的接收类MemberInfo,是Type类的父类,这里把MemberInfo改成Type也行。

然后咱在获取一下特性的具体内容,下面这个例子获取整个特性附加的元数据。

自定义特性代码:

使用到该特性的类:

主函数:

    上面是完整的代码,所有获取的思想均为使用Type类获取想要搜索类的元数据,再通过反射的几个函数GetProperties、GetCustomAttributes、GetMethods来进一步获取相关的特性信息。

最终打印结果如下:

    上面还有一个问题,可以看到在遍历方法特性时,有一部分是注释掉的,这段内容和旁边没注释掉的内容其实看起来差不多,但是这一段跑不通,我暂时也不知道为什么,嗯...

    最后看一下GetCustomAttributes这个函数的参数,GetCustomAttributes(true)会搜索继承链中的父级类型,而GetCustomAttributes(false)只搜索当前类型。所以根据需求自己进行设置。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值