C# 創(chuàng)建特性
通過System.Attribute類進(jìn)行派生,我們也可以創(chuàng)建出自己的特性。一般來(lái)說,如果除了包含和不包含特定的特性外,我們的代碼不需要獲得更多信息就可以完成需要的工作,那么我們不必完成這些額外的工作。但有時(shí),如果我們希望某些特性可以被自定義,則可以提供非默認(rèn)的構(gòu)造函數(shù)和/或可寫屬性.
另外,還需要為自己的特性做兩個(gè)選擇:要將其應(yīng)用到什么類型的目標(biāo)(類、屬性或其他),以及是否可以對(duì)同一個(gè)目標(biāo)進(jìn)行多次應(yīng)用。要指定上述信息,我們需要通過對(duì)特性應(yīng)用一個(gè)特性來(lái)實(shí)現(xiàn)(這句話實(shí)在是很拗口?。?,這個(gè)特性就是AttributeUsageAttribute。這個(gè)特性帶有一個(gè)類型為AttributeTargets的構(gòu)造函數(shù)參數(shù)值,通過|運(yùn)算符即可通過相應(yīng)的枚舉值組合出我們需要的值。另外,該特性還有一個(gè)布爾值類型的屬性AllowMultiple.用于指定是否可以多次應(yīng)用特性。
例如,下面的代碼指定了一個(gè)可以應(yīng)用到類或?qū)傩灾?一次)的特性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple = false)]
class DoeslnterestingThingsAttribute : Attribute
{
public DoesInterestingThingsAttribute(int howManyTimes)
{
HowManyTimes = howManyTimes;
}
public string WhatDoesltDo { get; set; }
public int HowManyTimes { get; private set; }
}
這樣,就可以像前面的代碼片段中看到的那樣來(lái)使用DoesMerestingTTiings特性了:
[DoesInterestingThings (1000, WhatDoesltDo = "voodoo")]
public class DecoratedClass {}
只要像下面這樣修改前面的代碼,就可以訪問這一特性的屬性:
Type classType = typeof{DecoratedClass);
object[] customAttributes = classType,GetCustomAttributes(true);
foreach (object customAttribute in customAttributes)
{
WriteLine ($.’Attribute of type {customAttribute} found.");
DoesInterestingThingsAttribute interestingAttribute = customAttribute as DoesInterestingThingsAttribute;
if (interestingAttribute != null)
{
WriteLine($"This class does {interestingAttribute,WhatDoesltDo} x " +
$"{interestingAttribute. HowManyTimes}!"};
}
}
運(yùn)用了本節(jié)講到的各種方法后,最終代碼將可以得到如圖所示的結(jié)果。
“特性”這一技術(shù)在所有.NET應(yīng)用程序都非常有用,特別是WPF和UniveGal Windows應(yīng)用程序。
點(diǎn)擊加載更多評(píng)論>>