attributeusage(AttributeUsage的细节解析)

AttributeUsage的细节解析

最近在.NET开发中,我遇到了AttributeUsage这个类。这个类是什么,有什么作用呢?下面让我们一起来看一看。

AttributeUsage类的定义与作用

AttributeUsage特性用于指定如何使用自定义的特性类。特性类将attribute修饰符引用到元素或声明上时,系统会根据AttributeUsage指定的属性来决定是否允许特性应用到指定作用域的程序元素上。

AttributeUsage的定义如下所示:

[AttributeUsage( validOn, AllowMultiple = allowMultiple, Inherited=inherited )]  

参数解释如下:

  • validOn:指定Attribute可加到哪个元素上,包括All(除Module外的所有元素),Assembly,Class,Constructor,Delegate,Enum,Event,Filed,GenericParameter,Interface,Method,Module,Parameter,Property和ReturnVaule。 多个元素用“|` 符号组合成一个枚举位掩码,例如AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)。
  • AllowMultiple:一个布尔值,指示是否可以应用多个该属性到单个目标上。默认值为false。
  • Inherited:一个布尔值,指示是否可能从基类继承此特性。实际上,特性只会被传递到继承树的根,如果不允许从基类继承,则该特性不会被任何派生类型继承。

AttributeUsage实例演示

如果我们自定义一个指定自定义特性使用范围的特性类,如下所示:

    [AttributeUsage(validOn: AttributeTargets.Class)]
    public class TestAttribute : Attribute
    {
        public string Description { get; set; }
    }

在自定义一个类Test1,并使用TestAttribute的特性类,如下所示:

    [TestAttribute(Description = \"Test1 Description\")]
    public class Test1
    {
    }

编译运行将报错:“CS0616 编译器找不到 类型或命名空间xxxx,也没有找到相应的命名空间引用(是否缺少程序集引用?)。”

这是因为我们在TestAttribute定义中指定了该特性可以用在AttributeTargets.Class范围内,但是我们在Test1上使用却不在该范围内。请将TestAttribute定义修改如下,并重新编译运行。

    [AttributeUsage(validOn: AttributeTargets.Class | AttributeTargets.Method)]
    public class TestAttribute : Attribute
    {
        public string Description { get; set; }
    }

此时我们再次对类Test1进行应用特性标注就不会报错了,如下所示:

    [TestAttribute(Description = \"Test1 Description\")]
    public class Test1
    {
    }

AttributeUsage中的常见问题

在使用AttributeUsage过程中,常常会有以下问题:

  • 未指定可应用的有效元素。AttributeUsage有效元素包括All、Assembly、Class、Constructor、Delegate、Enum、Event、Field、GenericTypeParameter、Interface、Method、Module、Parameter、Property、ReturnValue,这些元素定义在AttributeTargets枚举中。
  • 在基础类中使用派生类的特性。在定义特性时,Inherited属性可以用于指定特性是否被派生类继承。如果不希望特性被派生类继承,则需要将Inherited属性设置为false。
  • 在特性构造函数中存储数据。特性构造函数中不能包含引用类型(static,ref)参数、调用基类构造函数的语句或带有参数名称的指定参数。在特性类中可以使用属性或字段存储数据。

AttributeUsage特性是.NET开发过程中非常有用的工具,可以用于有效地描述和标记代码中的元素,并达到多种目的。在使用的过程中,我们必须仔细了解其细节,以避免不必要的麻烦和错误。

文章来自互联网,只做分享使用。发布者:苇叶生活,转转请注明出处:https://www.weiyetrade.com/jwrc/19933.html

argumentscallee(Argumentscallee:JavaScript函数中的特殊变量)
上一篇
barometer(测压计 监测空气压力、预测气象变化的利器)
下一篇

相关推荐