C# AttributeUsage使用案例详解

 更新时间:2021年08月28日 15:06:18   作者:honey199396  
这篇文章主要介绍了C# AttributeUsage使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

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的使用有所帮助。

到此这篇关于C# AttributeUsage使用案例详解的文章就介绍到这了,更多相关C# AttributeUsage使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C#使用CefSharp控件实现爬虫

    C#使用CefSharp控件实现爬虫

    这篇文章介绍了C#使用CefSharp控件实现爬虫的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 解决Unity urp级联阴影接缝问题

    解决Unity urp级联阴影接缝问题

    通过从unity内部函数中抽几个出来改造,强制取某个裁切球的级联阴影映射,通过案例给大家详细介绍,文中给出了完整的urp shader代码,对Unity级联阴影知识感兴趣的朋友一起看看吧
    2021-06-06
  • C#实现Log4Net日志分类和自动维护实例

    C#实现Log4Net日志分类和自动维护实例

    这篇文章主要介绍了C#实现Log4Net日志分类和自动维护,实例讲述了Log4Net日志分类和自动维护的实现方法,并提供了完整的实例供大家参考学习,需要的朋友可以参考下
    2014-10-10
  • c#实现md5加密示例

    c#实现md5加密示例

    这篇文章主要介绍了md5加密,加密结果可以为32位、48位、64位,只要修改一下参数就可以实现
    2014-01-01
  • C#文件操作类分享

    C#文件操作类分享

    这篇文章主要为大家分享了C#文件操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#文件后缀名的详细介绍

    C#文件后缀名的详细介绍

    这篇文章详细介绍了C#文件后缀名,有需要的朋友可以参考一下
    2013-09-09
  • c#制作屏幕保护程序步骤(字幕屏保)

    c#制作屏幕保护程序步骤(字幕屏保)

    本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保。下面是用C#如何编写屏幕保护的整个过程
    2014-01-01
  • C#查找字符串所有排列组合的方法

    C#查找字符串所有排列组合的方法

    这篇文章主要介绍了C#查找字符串所有排列组合的方法,涉及C#字符串操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#操作注册表之Registry类

    C#操作注册表之Registry类

    这篇文章介绍了C#操作注册表之Registry类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • .net的序列化与反序列化实例

    .net的序列化与反序列化实例

    这篇文章主要介绍了.net的序列化与反序列化实例,详细讲述了.net序列化与反序列化的基本原理与用法实例,具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-10-10

最新评论