zoukankan      html  css  js  c++  java
  • 《Inside C#》笔记(七) Attribute

    Attribute特性可以说是具有开创新的意义,因为一般的语言在被设计出来后,它所具有的能力就已经固定了。而借助Attribute特性,我们可以为C#已有的类型附加信息,既可以在编程时(design-time)附加(如代码描述)、也可以附加运行时(run-time)信息(如数据库字段映射)、还可以使用Attribute控制代码的行为(如权限检查)。Attribute可以提供无限的可能。

     

    一 Attribute的声明

    在使用Attribute标签之前,首先要定义它

     

    上面的代码就是Attribute的声明方式,[RegistryKey]标签的背后是一个继承了System.Attribute的类RegistryKeyAttribute,类的构造函数有两个参数,那么使用时也要对应传递两个参数

     

    约定Attribute声明时类名称使用***Attribute,以Attribute结尾,在使用时则可以省去结尾的Attribute。

     

    二 Attribute的使用

    为了查找附加在一个类型上的Attribute,需要用反射的方式。

    a) 类上的Attribute

    定义一个Attribute如下

     

     

    然后在MyRemoteableClass标记

     

     

    那么,RemoteObjectAttribute的使用方式就可以是这样的。

    使用typeof获取到类型后,使用.GetCustomAttributes()方法可以获取所有附加的Attribute

     

     

    b) 方法上的Attribute

    比如有一个TransactionableAttribute标记在方法上。

     

     

    使用方式与类的有区别

     

    获取到type后,还要用type.GetMethods()获取到类内部的方法的MethodInfo,然后再使用GetCustomAttributes。

     

    c) 字段上的Attribute

    同理,需要先使用type.GetFields()获取到所有字段的FieldInfo。

     

    三 Attribute的参数

    a) 在前面的RegistryKeyAttribute,使用了两个参数。

     

     

    但如果有的参数不是经常变化,就可以改造成命名参数(named parameter),例如第一个参数,可以从构造函数,改成属性,如果需要改变时,可单独为其设置值。

     

    需要注意的是,命名参数必须放在固定参数的后面,固定参数也不能采用类似命名参数的写法,因为编译器的处理方式是找到命名参数,然后将剩下的参数作为固定参数,如果固定参数也按照命名参数来写,编译器就不知道为构造函数怎么赋值了。命名参数的方式可以访问的类型包括所有公开的字段或属性,还包括setter方法,但这些都不能是被static或const修饰的。

     

    b) Attribute参数可使用的类型包括值类型、System.Type、.object、枚举、一维数组(数组元素的类型只能属于前面列举的类型),但不能是类(class)。因为Attribute在编码时就被使用,那是是没有实例化的类的。

     

     

  • 相关阅读:
    10 道选择题,测试你是不是死忠谷粉
    JBoss Seam 3.0.0.Beta2 发布
    送给十二星座的名言警句
    Chinasb & B3log!
    GAE 博客——B3log Solo 0.2.5 正式版发布了!
    明天发布 B3log Solo 0.2.5
    JBoss Seam 3.0.0.Beta2 发布
    10 道选择题,测试你是不是死忠谷粉
    Python数据分析工具包:Pandas
    Programming Computer Vision with Python: Tools and algorithms for analyzing images
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7074965.html
Copyright © 2011-2022 走看看