C# AttributeUsage的使用是如何的呢?首先讓我們來了解一下什么是AttributeUsage類它是另外一個預定義特性類,AttributeUsage類的作用就是幫助我們控制定制特性的使用。其實AttributeUsage類就是描述了一個定制特性如和被使用。
C# AttributeUsage的使用要明白:
AttributeUsage有三個屬性,我們可以把它放置在定制屬性前面。第一個屬性是:
◆ValidOn
通過這個屬性,我們能夠定義定制特性應該在何種程序實體前放置。一個屬性可以被放置的所有程序實體在AttributeTargets enumerator中列出。通過OR操作我們可以把若干個AttributeTargets值組合起來。
◆AllowMultiple
這個屬性標記了我們的定制特性能否被重復放置在同一個程序實體前多次。
◆Inherited
我們可以使用這個屬性來控制定制特性的繼承規則。它標記了我們的特性能否被繼承。
C# AttributeUsage的使用實例:
下面讓我們來做一些實際的東西。我們將會在剛才的Help特性前放置AttributeUsage特性以期待在它的幫助下控制Help特性的使用。
[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")] //error public class AnyClass { public void AnyMethod() { } }
它產生了一個編譯期錯誤。
AnyClass.cs: Duplicate 'Help' attribute
Ok,現在我們來討論一下最后的這個屬性。Inherited, 表明當特性被放置在一個基類上時,它能否被派生類所繼承。
[Help("BaseClass")] public class Base { } public class Derive : Base { }
C# AttributeUsage的使用會有四種可能的組合:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]
C# AttributeUsage的使用第一種情況:
如果我們查詢(Query)Derive類,我們將會發現Help特性並不存在,因為inherited屬性被設置為false。
var type = typeof(Derive); Assert.False(type.IsDefined(typeof(HelpAttribute),true)); Assert.False(type.IsDefined(typeof(HelpAttribute), false));
C# AttributeUsage的使用第二種情況:
和第一種情況相同,因為inherited也被設置為false。
C# AttributeUsage的使用第三種情況:
對於第三種和第四種,通過類型查找都是一樣的
[Fact] public void AttributeTest() { var type = typeof(Derive); Assert.True(type.IsDefined(typeof(HelpAttribute),true)); Assert.False(type.IsDefined(typeof(HelpAttribute), false)); }
我們給派生類添加點代碼,來解釋第三種和第四種情況,:
[Help("BaseClass")] public class Base { } [Help("DeriveClass")] public class Derive : Base { }
現在我們來查詢一下Help特性,我們只能得到派生類的屬性,因為inherited被設置為true,但是AllowMultiple卻被設置為false。因此基類的Help特性被派生類Help特性覆蓋了。
var type = typeof(Derive); //Assert.True(type.IsDefined(typeof(HelpAttribute),true)); //Assert.False(type.IsDefined(typeof(HelpAttribute), false)); Assert.True(type.GetCustomAttributes(true).Count() == 1);
C# AttributeUsage的使用第四種情況:
在這里,我們將會發現派生類既有基類的Help特性,也有自己的Help特性,因為AllowMultiple被設置為true。
var type = typeof(Derive); //Assert.True(type.IsDefined(typeof(HelpAttribute),true)); //Assert.False(type.IsDefined(typeof(HelpAttribute), false)); Assert.True(type.GetCustomAttributes(true).Count() > 1);
C# AttributeUsage的相關內容就向你介紹到這里,希望對你了解和掌握C# AttributeUsage的使用有所幫助。