找出枚举是否设置了"标志"属性

Car*_*ngo 22 c# reflection enums

使用反射,如何确定枚举是否具有Flags属性

所以对于MyColor返回true

[Flags]
public enum MyColor
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}
Run Code Online (Sandbox Code Playgroud)

并为MyTrade返回false

public enum MyTrade
{
    Stock = 1,
    Floor = 2,
    Net = 4,
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 29

if (typeof(MyEnum).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0)
Run Code Online (Sandbox Code Playgroud)


cuo*_*gle 24

如果您使用的是.NET 4.5:

if (typeof(MyColor).GetCustomAttributes<FlagsAttribute>().Any())
{
}
Run Code Online (Sandbox Code Playgroud)

  • 有点晚了,但我相信`typeof(MyColor).IsDefined(typeof(FlagsAttribute),false)`就是这样做的.避免必须处理集合. (19认同)
  • 需要添加`using System.Reflection;`来访问扩展名. (3认同)
  • @ErenErsönmez:这是.Net 4.5的新扩展方法. (2认同)

khe*_*ang 15

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

typeof(MyColor).IsDefined(typeof(FlagsAttribute), inherit: false); // true
typeof(MyTrade).IsDefined(typeof(FlagsAttribute), inherit: false); // false
Run Code Online (Sandbox Code Playgroud)

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

using System.Reflection;

typeof(MyColor).IsDefined<FlagsAttribute>(inherit: false); // true
typeof(MyTrade).IsDefined<FlagsAttribute>(inherit: false); // false
Run Code Online (Sandbox Code Playgroud)

  • 我在文档中找不到“IsDefined”的通用版本。这是从哪里来的? (3认同)