【问题标题】:Finding out if an enum has the "Flags" attribute set找出枚举是否设置了“标志”属性
【发布时间】:2013-01-22 14:56:52
【问题描述】:

使用反射,我如何确定一个枚举是否具有标志属性

所以对于 MyColor 返回 true

[Flags]
public enum MyColor
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}

对于 MyTrade,返回 false

public enum MyTrade
{
    Stock = 1,
    Floor = 2,
    Net = 4,
}

【问题讨论】:

    标签: c# reflection enums


    【解决方案1】:
    if (typeof(MyEnum).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0)
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 .NET 4.5:

      if (typeof(MyColor).GetCustomAttributes<FlagsAttribute>().Any())
      {
      }
      

      【讨论】:

      • @ErenErsönmez:这是 .Net 4.5 的新扩展方法。
      • 需要添加using System.Reflection; 才能访问扩展。
      • 有点晚了,但我相信typeof(MyColor).IsDefined(typeof(FlagsAttribute), false) 就是为此而生的。避免处理集合。
      • @C.Evenhuis - 这个答案绝对是最好的。即使性能影响接近于零,我们也并不真正想要分析集合。所以我们不这样做。
      • @C.Evenhuis 这正是我下面的答案;)
      【解决方案3】:

      如果您只想检查一个属性是否存在,而不检查任何属性数据,您应该使用MemberInfo.IsDefined。它返回一个bool,表示“指定类型或其派生类型的一个或多个属性是否应用于此成员”,而不是处理属性集合。

      示例

      typeof(MyColor).IsDefined(typeof(FlagsAttribute), inherit: false); // true
      typeof(MyTrade).IsDefined(typeof(FlagsAttribute), inherit: false); // false
      

      或者,如果您使用的是 .NET 4.5+:

      using System.Reflection;
      
      typeof(MyColor).IsDefined<FlagsAttribute>(inherit: false); // true
      typeof(MyTrade).IsDefined<FlagsAttribute>(inherit: false); // false
      

      【讨论】:

      • 我在文档中找不到IsDefined 的通用版本。这是哪里来的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多