位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 創(chuàng)建特性

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    通過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é)果。

image.png

“特性”這一技術(shù)在所有.NET應(yīng)用程序都非常有用,特別是WPF和UniveGal Windows應(yīng)用程序。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部