2011-02-17 28 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)]