2011-02-17 61 views
33

我想用我的IsGPUBasedAttribute,枚舉成員是這樣的:我應該爲枚舉成員使用什麼AttributeTarget?

public enum EffectType 
{ 
    [IsGPUBased(true)] 
    PixelShader, 

    [IsGPUBased(false)] 
    Blur 
} 

但是編譯器不會讓我使用:

[AttributeUsage (AttributeTargets.Enum, AllowMultiple = false)] 

什麼是正確的AttributeTarget值的使用限制枚舉成員?

回答

41

據我所知,沒有一個專門爲枚舉常量。最接近你可能會是「Field」,它限制了類或結構的字段成員的使用(Enum常量被視爲屬性的目的)。

編輯:帶來的解釋「爲什麼」了從註釋,枚舉常量正是這樣,因此他們的價值和用途是embedded directly into the IL。因此枚舉聲明是真的不怎麼從創建一個靜態的類定義靜態常量成員不同:

public static class MyEnum 
{ 
    public const int Value1 = 0; 
    public const int Value2 = 1; 
    public const int Value3 = 2; 
    public const int Value4 = 3;   
} 

...唯一的區別是,它從System.Enum派生這是值類型,而不是作爲一個參考類(你不能創建一個靜態結構,也不能創建一個不可重構的結構)。

+0

謝謝你的作品。你知道爲什麼MS沒有提供一個枚舉常量嗎? – 2011-02-17 18:12:45

+0

因爲在編譯級別,枚舉常量和普通成員字段之間沒有太大的區別;你必須檢查包含的類型並確定它來自Enum。另外,實際上並沒有太多的需要一個只能應用於枚舉常量的屬性。我曾經應用於枚舉常量的唯一一個是來自System.ComponentModel的DescriptionAttribute,它可以應用於任何AFAIK。 – KeithS 2011-02-17 18:25:54

2

沒有辦法指定一個屬性只能用於枚舉成員。老實說,如果你打算擁有這樣的多個屬性,你可能會更好地創建自己的Effect(或EffectType)類並將它們實現爲普通屬性。

例如,

public class EffectType 
{ 
    public bool IsGpuBased { get; private set; } 

    private EffectType(bool isGpuBased) 
    { 
     IsGpuBased = isGpuBased; 
    } 

    public static readonly EffectType PixelShader = new EffectType(true); 
    public static readonly EffectType Blur = new EffectType(false); 
} 

採取這種方法會給你的代碼是既更容易閱讀和比較,元數據提取將有更好的表現。

9

AttributeTarget.Field允許您爲枚舉值使用屬性。

0

[AttributeUsage(AttributeTargets.Field)]