【问题标题】:What AttributeTarget should I use for enum members?我应该为枚举成员使用什么 AttributeTarget?
【发布时间】:2011-06-29 07:12:35
【问题描述】:

我想将我的IsGPUBasedAttribute 用于这样的枚举成员:

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

    [IsGPUBased(false)]
    Blur
}

但编译器不允许我使用:

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

什么是正确的AttributeTarget 值来限制枚举成员的使用?

【问题讨论】:

    标签: c# .net enums custom-attributes


    【解决方案1】:

    据我所知,没有专门针对枚举常量的。您可以得到的最接近的可能是“字段”,它限制了对类或结构的字段成员的使用(枚举常量被视为用于属性的目的)。

    编辑:从 cmets 中解释“为什么”,枚举常量正是如此,因此它们的值和用法是 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,它是一种值类型,而不是引用类(您不能创建静态结构,也不能创建不可构造的结构)。

    【讨论】:

    • 谢谢你的作品。你知道为什么 MS 没有为枚举常量提供一个吗?
    • 因为在编译层面,枚举常量和普通成员字段并没有太大区别;您必须检查包含类型并确定它是从 Enum 派生的。此外,对于只能应用于枚举常量的属性确实没有太多要求。我唯一应用于枚举常量的是 System.ComponentModel 中的 DescriptionAttribute,它可以应用于任何 AFAIK。
    • 谢谢,我也只对枚举常量使用了DescriptionAttribute,这是我在实际代码中使用的类似属性。
    • 你说没有太大区别,但是enums 作为一等公民的最大区别是他们为你提供了一种强类型的处理方式。在你的情况下,我可以做到这一点 if (MyEnum.Value1 == 235)int i = MyEnum.Value1; i = SomeOtherEnum.Value1 等。但对于枚举是不可能的(没有一些明确的转换)。
    • 我知道这篇文章真的很老了,但我目前的情况是根据条目值随机选择枚举值,使某些选项更有可能出现并排除无法随机化的选项, public enum Test { [DisallowRandom]None,[Entry(4)]Test1,[Entry(2)]Test2,[Entry(1)]Test3}
    【解决方案2】:

    没有办法指定属性只能用于枚举成员。老实说,如果您要拥有多个这样的属性,您最好创建自己的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);
    }
    

    与元数据提取相比,采用这种方法将使您的代码更易于阅读并且性能更好。

    【讨论】:

    • 谢谢,实际代码不是这样的,只是想为这个问题给出一个简化的假设示例。
    • @Joan:我认为它仍然支持我的建议。
    • 没关系,我只是说我贴的代码是编造的,因为我只想知道属性对枚举常量的限制。
    • @Joan:关于这个问题,我赞同@KeithS 的评论,因为没有足够的需求,它可能不存在。而且我仍然会说,与使用属性相比,自定义类型是更好的选择;)
    【解决方案3】:

    AttributeTargets.Field 允许你为枚举值使用属性。

    [AttributeUsage(AttributeTargets.Field)]
    

    【讨论】:

    • 不完美,但仍然比“全部”更受限制,谢谢。
    【解决方案4】:
    [AttributeUsage(AttributeTargets.Field)]
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多