最近在.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