Какой AttributeTarget я должен использовать для членов enum? - PullRequest
40 голосов
/ 17 февраля 2011

Я хочу использовать мой IsGPUBasedAttribute для перечислимых членов, таких как:

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

    [IsGPUBased(false)]
    Blur
}

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

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

Что является правильнымAttributeTarget значение для ограничения использования перечислимых членов?

Ответы [ 4 ]

56 голосов
/ 17 февраля 2011

Насколько я знаю, не существует одного специально для констант enum.Самое близкое, что вы могли бы получить, это, вероятно, «Поле», которое ограничивает использование членами поля класса или структуры (для которых константы Enum обрабатываются так же, как и для атрибутов).* Принимая объяснение «почему» из комментариев, константы Enum являются именно такими, и поэтому их значения и использования встроены непосредственно в IL .Поэтому объявление 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, который является типом значения вместобудучи ссылочным классом (вы не можете создать ни статическую, ни неконструктивную структуру).

10 голосов
/ 13 мая 2013

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

[AttributeUsage(AttributeTargets.Field)]
3 голосов
/ 17 февраля 2011

Нет способа указать, что атрибут может использоваться только для членов перечисления. Честно говоря, вам, вероятно, лучше создать собственный класс 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);
}

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

1 голос
/ 30 декабря 2017
[AttributeUsage(AttributeTargets.Field)]
...