我想将IsGPUBasedAttribute
用于这样的枚举成员:
public enum EffectType
{
[IsGPUBased(true)]
PixelShader,
[IsGPUBased(false)]
Blur
}
但编译器不允许我使用:
[AttributeUsage (AttributeTargets.Enum, AllowMultiple = false)]
限制枚举成员使用的正确AttributeTarget
值是什么?
答案 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)]