2011-02-17 28 views
33

Quiero usar mi IsGPUBasedAttribute para los miembros de enumeración de este tipo:¿Qué AttributeTarget debería usar para los miembros de enum?

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

    [IsGPUBased(false)] 
    Blur 
} 

pero el compilador no me deja de usar:

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

¿Cuál es el valor correcto AttributeTarget para limitar el uso de enum miembros?

Respuesta

41

Hasta donde sé, no hay uno específicamente para las constantes enum. Lo más cercano que podría obtener sería probablemente "Campo", que limita el uso a los miembros de campo de una clase o estructura (que las constantes de Enum se tratan como a efectos de los atributos).

EDIT: con lo que la explicación del "por qué" a partir de los comentarios, las constantes de enumeración son exactamente eso, y como tal, sus valores y usos son embedded directly into the IL. por lo tanto, una declaración de enumeración no es realmente muy diferente de la creación de una definición de clase estática con los miembros estáticos como:

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

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

+0

Gracias eso funciona. ¿Sabes por qué MS no proporcionó uno para las constantes enum? –

+0

Porque en el nivel compilado, no hay mucha diferencia entre una constante enum y un campo de miembro ordinario; Tendría que examinar el tipo que lo contiene y determinarlo deriva de Enum. Además, realmente no hay mucha demanda de un atributo que solo se pueda aplicar a las constantes enum. El único que he aplicado a una constante enum es DescriptionAttribute, de System.ComponentModel, que se puede aplicar a cualquier elemento AFAIK. – KeithS

+0

Gracias, también utilicé DescriptionAttribute para constantes enum, este es un atributo similar que estoy usando en el código actual. –

2

No hay una forma de especificar que un atributo se pueda usar solo en los miembros enum. Honestamente, probablemente sea mejor que crees tu propia clase Effect (o EffectType) y la implementes como propiedades ordinarias 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); 
} 

Tomando este enfoque le dará un código que es a la vez fácil de leer y se obtienen mejores resultados en comparación con la extracción de metadatos.

+1

Gracias, el código real no es así, solo quería dar un ejemplo hipotético simplificado para la pregunta. –

+0

@Joan: Creo que aún se mantendrá mi recomendación. –

+1

Eso está bien, solo digo que el código que publiqué está compuesto, porque solo quiero saber la restricción de atributos a las constantes enum. –

9

AttributeTarget.Field le permite usar el atributo para valores enum.

0

[AttributeUsage (AttributeTargets.Field)]

Cuestiones relacionadas