我应该为枚举成员使用什么AttributeTarget?

时间:2011-02-17 18:06:38

标签: c# .net enums custom-attributes

我想将IsGPUBasedAttribute用于这样的枚举成员:

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

    [IsGPUBased(false)]
    Blur
}

但编译器不允许我使用:

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

限制枚举成员使用的正确AttributeTarget值是什么?

4 个答案:

答案 0 :(得分:55)

据我所知,没有专门针对枚举常量的内容。你可以获得的最接近的可能是“Field”,它限制了对类或结构的字段成员的使用(对于属性,Enum常量被视为)。

编辑:从评论中引出“为什么”的解释,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,它是一个值类型而不是一个引用类(你不能创建一个静态结构,也不能创建一个不可构造的结构)。

答案 1 :(得分:10)

AttributeTargets.Field允许您为枚举值使用属性。

[AttributeUsage(AttributeTargets.Field)]

答案 2 :(得分:3)

无法指定属性只能在枚举成员上使用。老实说,你可能最好创建自己的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);
}

与元数据提取相比,采用这种方法将为您提供更易于阅读且性能更佳的代码。

答案 3 :(得分:1)

[AttributeUsage(AttributeTargets.Field)]
相关问题