当前位置: 首页 > news >正文

定义/控制自定义属性的使用

AttributeUsage类是一个预定义的属性类,以帮助我们控制自定义属性的使用.也就是我们可以定义自定义属性类的属性.这个类描述了如何使用自定义的属性类.AttributeUsage有三个数据属性可用以修饰我们的自定义的属性.


ValidOn  定义了自定义属性在哪些程序实体上可被使用.这个可使用实体列表可通过  AttributeTargets枚举类型的OR操作进行设置


AllowMutiple  定义了是否可在同一个程序实体上同时使用多个属性进行修饰


Inherited  定义了自定义的修饰是否可由被修饰类的派生类继承


  让我们做点具体的吧。我们将会用一个AttributeUsage属性修饰我们的属性类,以控制其作用范围: 

using System;
[AttributeUsage(AttributeTargets.Class), AllowMultiple = false, Inherited = false ]
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Description_in)
    {
        this.description = Description_in;
    }
    protected String description;
    public String Description
    {
        get 
        {
            return this.description;
        }            
    }    
}

  先看看AttributeTargets.Class,说明了我们的Help属性只能用以修饰类,下面的这段代码将会导致一个编译错误(“属性Help不能用在这样的声明上,它只能用在类的声明上”),因为我们用Help属性去修饰方法AnyMethod()了: 

[Help("this is a do-nothing class")]
public class AnyClass
{
    [Help("this is a do-nothing method")]    //error
    public void AnyMethod()
    {
    }
} 

编译错误:

AnyClass.cs: Attribute ''Help'' is not valid on this declaration type. 
It is valid on ''class'' declarations only.

   当然我们可以AttributeTargets.All来允许Help属性修饰任何类型的程序实体。AttributeTargets可能的值包括:

  • Assembly,
  • Module,
  • Class,
  • Struct,
  • Enum,
  • Constructor,
  • Method,
  • Property,
  • Field,
  • Event,
  • Interface,
  • Parameter,
  • Delegate,
  • All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate,
  • ClassMembers = Class | Struct | Enum | Constructor | Method | Property | Field | Event | Delegate | Interface )

  接下来,该看看AllowMultiple = false这句了:它确定了不能象下面这样,在同一实体上同时使用多个同种属性进行修饰:

[Help("this is a do-nothing class")]
[Help("it contains a do-nothing method")]
public class AnyClass
{
    [Help("this is a do-nothing method")]        //这也是错误的,因为Help属性只能修饰类
    public void AnyMethod()
    {
    }
}

编译错误:

      AnyClass.cs: Duplicate ''Help'' attribute

  我们再来谈谈AttributeUsage的最后一个数据属性Inherited:定义了自定义属性的修饰是否可由被修饰类的派生类继承。基于下示代码表示的继承关系,让我们看看会发生什么吧:

[Help("BaseClass")] 
public class Base
{
}

public class Derive :  Base
{
}

我们选择了AttributeUsage的四种组合:

  • [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]
  • [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]
  • [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]
  • [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]

对应上述组合的结果:

    1. 如果我们查询(稍后我们会看见如何在运行时查询一个类的属性信息。)这个Derive类的Help属性时,会因其未从基类继承该属性而一无所获。
    2. 因为同样的原因,得到与结果一同样的结果。
    3. 为了解释这后面的两种情况,我们把同样的属性也用在这个Derive派生类上,代码修改如下:
[Help("BaseClass")] 
public class Base
{
}

[Help("DeriveClass")] 
public class Derive :  Base
{
}
  1. 我们的查询会同时得到其类Base与派生类Dervie的Help属性信息,因为继承与多重修饰均被允许。

注意:
  
AttributeUsage只能用于System.Attribute的派生类,且该派生类的AllowMultiple与Inherited都为false。

转载于:https://www.cnblogs.com/wangluochong/p/3602116.html

相关文章:

  • 【产品经理入门记】产品经理需要掌握的十大知识模块
  • 七、我的人生经历《我践行诚信的过程》
  • 总是保存下拉选项的第一个值
  • 一个xss漏洞到内网漫游【送多年心血打造的大礼包啦!】
  • Python基础06 循环
  • winscp 怎么用私钥文件登录的,以.ppk结尾的密钥文件
  • 敏捷开发---综述
  • kafka扫盲笔记,实战入门
  • spring如何从jar中读取applicationContext.xml配置文件?
  • Spring Cloud Feign的两种使用姿势
  • Tornado实现多进程/多线程的HTTP服务
  • 数据库之左连接,右连接和内连接
  • C++ 引用
  • ES6 ...操作符
  • 2.Median of Two Sorted Arrays (两个排序数组的中位数)
  • [笔记] php常见简单功能及函数
  • [译] React v16.8: 含有Hooks的版本
  • avalon2.2的VM生成过程
  • echarts的各种常用效果展示
  • es6
  • IP路由与转发
  • javascript数组去重/查找/插入/删除
  • scala基础语法(二)
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vue组件定义
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 和 || 运算
  • 回顾 Swift 多平台移植进度 #2
  • 世界上最简单的无等待算法(getAndIncrement)
  • 学习ES6 变量的解构赋值
  • 用Visual Studio开发以太坊智能合约
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 组复制官方翻译九、Group Replication Technical Details
  • $(selector).each()和$.each()的区别
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (第一天)包装对象、作用域、创建对象
  • (六)vue-router+UI组件库
  • (转)http协议
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net 6.0 处理跨域的方式
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .py文件应该怎样打开?
  • @Bean有哪些属性
  • @ConfigurationProperties注解对数据的自动封装
  • @property括号内属性讲解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票