C# AttributeUsage的使用如何的呢?首先让们来了解一下什么AttributeUsage类它另外一个预定义特性类,AttributeUsage类的作用就帮助们控制定制特性的使用。其实AttributeUsage类就描述了一个定制特性如和被使用。
C# AttributeUsage的使用要明白:
AttributeUsage有三个属性,们可以把它放置在定制属性前面。
•ValidOn
通过这个属性,们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作们可以把若干个AttributeTargets值组合起来。
通过这个属性,们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在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 {
[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 {
enum类型如何使用 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()
{
}
}
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特性被放置在任何程序实体前。可能的值:
It is valid on ‘class' declarations only.
们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值:
Assembly,
Module,
Class,
Struct,
Enum,
Constructor,
Method,
Property,
Field,
Event,
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 )
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("it contains a do-nothing method")]
public class AnyClass
{
[Help("this is a do-nothing method")] //error
public void AnyMethod()
{
}
}
[Help("this is a do-nothing method")] //error
public void AnyMethod()
{
}
}
它产生了一个编译期。
AnyClass.cs: Duplicate ‘Help' attribute
Ok,现在们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。
Ok,现在们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。
[Help("BaseClass")]
public class Base
{
}
public class Base
{
}
public class Derive : Base
{
}
C# AttributeUsage的使用会有四种可能的组合:
[Help("BaseClass")]
public class Base
{
}
public class Derive : Base
{
}
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
{
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的使用有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论