C# AttributeUsage使用案例详解

作者:honey199396 时间:2022-06-25 08:12:09 

C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用。其实AttributeUsage类就是描述了一个定制特性如和被使用。

C# AttributeUsage的使用要明白:

AttributeUsage有三个属性,我们可以把它放置在定制属性前面。

  • ValidOn
       通过这个属性,我们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作我们可以把若干个AttributeTargets值组合起来。

  •  AllowMultiple
       这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。

  • Inherited
       我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。

C# AttributeUsage的使用实例:

下面让我们来做一些实际的东西。我们将会在刚才的Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。


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特性只能被放在class的前面。这也就意味着下面的代码将会产生错误:


[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特性被放置在任何程序实体前。可能的值是:


  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")] //error  
   public void AnyMethod()
   {  
   }
}

它产生了一个编译期错误。

AnyClass.cs: Duplicate ‘Help' attribute
Ok,现在我们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。


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

public class Derive : Base  
{  
}

C# AttributeUsage的使用会有四种可能的组合:


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

public class Derive : Base  
{  
}

C# AttributeUsage的使用第一种情况:

如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。

C# AttributeUsage的使用第二种情况:

和第一种情况相同,因为inherited也被设置为false。

C# AttributeUsage的使用第三种情况:

为了解释第三种和第四种情况,我们先来给派生类添加点代码:


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

现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。

C# AttributeUsage的使用第四种情况:

在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。

C# AttributeUsage的相关内容就向你介绍到这里,希望对你了解和掌握C# AttributeUsage的使用有所帮助。

来源:https://blog.csdn.net/honey199396/article/details/51316754

标签:C#,AttributeUsage
0
投稿

猜你喜欢

  • 举例讲解Java中synchronized关键字的用法

    2023-07-01 22:20:19
  • Java 实现一个汉诺塔实战练习

    2021-12-20 14:49:47
  • VScode 打造完美java开发环境最新教程

    2023-02-24 16:02:10
  • C#在运行时动态创建类型的实现方法

    2023-08-26 21:51:17
  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    2023-01-19 15:15:42
  • java中String、StringBuffer与StringBuilder的区别

    2021-11-12 13:28:24
  • Java+MySQL实现学生信息管理系统源码

    2023-11-28 04:29:31
  • Java中驼峰命名与下划线命名相互转换

    2021-10-01 00:56:47
  • IntelliJ Plugin 开发之添加第三方jar的示例代码

    2021-11-27 13:35:52
  • 详解IDEA中SpringBoot整合Servlet三大组件的过程

    2023-05-06 15:23:13
  • springboot使用AOP+反射实现Excel数据的读取

    2022-12-10 05:25:55
  • 为什么不建议使用Java自定义Object作为HashMap的key

    2021-09-21 06:15:05
  • Spring实现内置监听器

    2021-07-06 01:29:06
  • Java SpringBoot高级用法详解

    2021-07-03 18:27:09
  • JDK动态代理原理:只能代理接口,不能代理类问题

    2023-06-16 03:18:40
  • Springboot配置文件内容加密代码实例

    2022-09-13 05:56:09
  • Java实现多任务执行助手

    2023-05-17 14:15:30
  • c# 深拷贝与浅拷贝的区别分析及实例

    2023-06-29 05:00:06
  • 快速了解c# 结构体

    2022-10-19 05:38:45
  • Java利用Selenium操作浏览器的示例详解

    2022-06-17 17:34:20
  • asp之家 软件编程 m.aspxhome.com