反射和Attribute

反射

简介
.Net中的类都被编译成IL,反射就可以在运行时获得类的信息(有哪些方法、字段、构造函数、父类是什么等等),还可以动态创建对象、调用成员。
每个类对应一个Type对象,每个方法对应一个MethodInfo对象,每个属性对应一个PropertyInfo……。这些就是类、方法、属性的“元数据”(meta data)。对象和这个类的对象没有直接关系。这些“元数据对象”和成员有关,和对象无关,也就是每个成员对应一个对象。
类元数据Type
获取类信息对象Type
对象获取:Type type = person.getType();
类名获取:Type type =typeof(Person);
从**全类名(命名空间+类名)**获取:Type type = Type.GetType(“com.rupeng.Person”);
这上面三种方法主要根据程序中所要探查的内容不一样,方式也就不一样。如果有一个对象,就用getType()获取,如果没有对象就可以用typeof;如果要运行时通过配置文件等拿到的字符串来获得就要用Type.GetType(“com.rupeng.Person”); 。

Activator.CreateInstance(type) //**使用无参数构造方法创建此类的对象(如果没有无参构造函数会报异常)。要求类必须有无参构造函数。

** 想当于是new Person();有同学可能会问可以new为啥还要这样绕一圈?但因为在真正的业务中可能我们在写这个代码的时候可能并不知道我们具体是执行的那个类,所以才会有这样的用法

关于this

this代表“当前对象”,不是“当前类”这个问题在类继承中尤其要注意。在父类中使用this,当创建一个子类对象的时候,去执行有关this的代码就是执行的子类中的实现。

  1. Type成员 IsInterface、IsArray、IsPrimitive、 IsEnum:是否接口、数组、原始类型、枚举等。
  2. String Name得到类名(不包含命名空间);String FullName包含命名空间
  3. BaseType得到父类的Type。

构造函数
ConstructorInfo GetConstructor(Type[] types)//获取参数类型匹配的构造函数
ConstructorInfo[] GetConstructors()//获得所有的public构造函数,包括父类的
调用object Invoke(object[] parameters)可以调用构造函数
方法
MethodInfo GetMethod(string name, Type[] types)
MethodInfo[] GetMethods() //获得所有的public方法
调用object Invoke(object obj, object[] parameters)可以调用方法
属性
PropertyInfo GetProperty(string name) 获取某个属性
PropertyInfo[] GetProperties() 获取所有属性
PropertyInfo的主要成员: CanRead、 CanWrite是否可读写; GetValue、 SetValue读写值(第一个参数是要在哪个对象要调用)

标签

常用Attribute

[Obsolete] 表明此成员已过时
当使用PropertyGrid的时候可以修饰属性
[ReadOnly(true)]在编辑器中只读,代码赋值不受影响;
[DisplayName(“姓名”)] 属性的显示名;
[Browsable(false)]属性是否可见

以后要学ASP.Net MVC、Entity Framework等框架中还有很多Attribute
Attribute语法
Attribute用来在代码中附加一些元信息,这些元信息可被编译器,.net framework,或者我们的程序使用。方法、属性、类等上都可以标注Attribute
一般起到说明、配置的作用;命名一般以Attribute结尾,如果以Attribute结尾的话使用的时候可以省略Attribute
注解不会直接影响代码的实际逻辑,仅仅起到辅助性的作用;如果起作用也是编译器、 .net framework 、程序去解析的。
在Type、MethodInfo、PropertyInfo等上都可以调用object[] GetCustomAttributes(Type attributeType, bool inherit)获取标注的注解对象,因为同一个Attribute可能标注多次,所以返回值是数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值