Подтвердить что ты не робот

Какой атрибут атрибута следует использовать для членов перечисления?

Я хочу использовать мои IsGPUBasedAttribute для членов перечисления следующим образом:

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

    [IsGPUBased(false)]
    Blur
}

но компилятор не позволяет мне использовать:

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

Какое значение имеет значение AttributeTarget для ограничения использования элементов перечисления?

4b9b3361

Ответ 1

Насколько я знаю, для констант перечисления не существует. Самое близкое, что вы могли бы получить, вероятно, было бы "Поле", что ограничивает использование членов поля класса или структуры (какие константы Enum рассматриваются как для целей атрибутов).

РЕДАКТИРОВАТЬ:, объясняя "почему" по сравнению с комментариями, константы Enum точно такие, и поэтому их значения и способы использования встроены непосредственно в ИЛ. Поэтому объявление перечисления действительно не очень отличается от создания определения статического класса со статическими константными членами:

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, который является типом значения, а не является ссылочным классом (вы не можете создать статическую структуру или неконструктивную).

Ответ 2

AttributeTargets.Field позволяет вам использовать атрибут для значений перечисления.

[AttributeUsage(AttributeTargets.Field)]

Ответ 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);
}

Используя этот подход, вы получите код, который будет легче читать и будет работать лучше по сравнению с извлечением метаданных.

Ответ 4

[AttributeUsage(AttributeTargets.Field)]