检查枚举是否已过时

Dar*_*ius 6 c# enums

如何检查enum是否标记为过时?

public enum MyEnums
{
    MyEnum1,
    [Obsolete("How can you know that I'm obsolete?")]
    MyEnum2,
    MyEnum3
}
Run Code Online (Sandbox Code Playgroud)

现在在运行时,我需要知道哪些是过时的:

foreach (var myEnum in Enum.GetValues(typeof(MyEnums)).Cast<MyEnums>())
{
    // How can I check if myEnum is obsolete?
}
Run Code Online (Sandbox Code Playgroud)

M4N*_*M4N 14

以下方法检查枚举值是否具有以下Obsolete属性:

public static bool IsObsolete(Enum value)
{
    var fi = value.GetType().GetField(value.ToString());
    var attributes = (ObsoleteAttribute[])
        fi.GetCustomAttributes(typeof(ObsoleteAttribute), false);
    return (attributes != null && attributes.Length > 0);
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

var isObsolete2 = IsObsolete(MyEnums.MyEnum2); // returns true
var isObsolete3 = IsObsolete(MyEnums.MyEnum3); // returns false
Run Code Online (Sandbox Code Playgroud)


jbt*_*ule 5

这是一个非常干净的扩展方法。诀窍是您正在使用枚举名称反映枚举类型之外的字段。

   public static bool IsObsolete(this Enum value)
   {  
      var enumType = value.GetType();
      var enumName = enumType.GetEnumName(value);
      var fieldInfo = enumType.GetField(enumName);
      return Attribute.IsDefined(fieldInfo, typeof(ObsoleteAttribute));
   }
Run Code Online (Sandbox Code Playgroud)