¿Qué AttributeTarget debo usar para los miembros de la enumeración?

Quiero usar mi IsGPUBasedAttribute para miembros de enumeración como este:

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

Pero el comstackdor no me deja usar:

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

¿Cuál es el valor correcto de AttributeTarget para limitar el uso a los miembros de la enumeración?

Por lo que sé, no hay uno específicamente para las constantes de enumeración. Probablemente, lo más cercano que podría estar cerca sería “Campo”, que limita el uso a los miembros de campo de una clase o estructura (que se tratan las constantes de Enum para fines de atributos).

EDITAR: trae la explicación de “por qué” de los comentarios, las constantes de enumeración son exactamente eso, y como tales, sus valores y usos están incrustados directamente en la IL . Por lo tanto, una statement de enumeración no es muy diferente de crear una definición de clase estática con miembros constantes estáticos:

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

… la única diferencia es que se deriva de System.Enum, que es un tipo de valor en lugar de ser una clase de referencia (no puede crear una estructura estática ni una estructura no estructurable).

AttributeTarget.Field le permite usar el atributo para los valores de enumeración.

No hay una manera de especificar que un atributo se puede usar solo en miembros de enumeración. Honestamente, probablemente estés mejor creando tu propia clase de Effect (o EffectType ) e implementándolas como propiedades comunes si vas a tener múltiples atributos como este.

Por ejemplo,

 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); } 

Tomar este enfoque le dará un código que es más fácil de leer y tendrá un mejor rendimiento en comparación con la extracción de metadatos.

[AttributeUsage (AttributeTargets.Field)]