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在编码时就被使用,那是是没有实例化的类的。

     

     

  • 相关阅读:
    小白如何在Windows下使用Redis
    OAuth2.0实例说明
    关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录
    Asp.net Controller中View 和Action方法认证Authorize 及对AuthorizeAttribute扩展
    MidpointRounding 枚举值简要说明
    JavaScript 去空格方法(转部份)
    脏读,不可重复读,幻读 (转)
    20111204 15:36 JAVA实现位向量给无重复元素的整数数组排序
    JAVA String
    CSS样式表的优先级别
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7074965.html
Copyright © 2011-2022 走看看