检查给定的类型是否为枚举


117

我正在为Json.NET写一个JsonConverter,它应该允许我将任何枚举转换为[Description]属性定义的字符串值。

例如:

public enum MyEnum {
    [Description("Sunday")] Sunday,
    [Description("Monday")] Monday,
    [Description("Tuesday")] Tuesday,
    [Description("Wednesday")] Wednesday,
    [Description("Thursday")] Thursday,
    [Description("Friday")] Friday,
    [Description("Saturday")] Saturday
}

我已经有了支持的代码,myEnum.Description()显然它将返回其字符串描述。

在JsonConverter实现中,有以下方法:

    public override bool CanConvert(Type objectType)
    {

    }

我试图弄清楚如何确定是否objectType为an Enum并返回true,以便转换器知道它可以转换此对象。由于我有很多Enum,所以我无法明确检查每个对象,因此我希望找到一种更通用的方法来完成此操作。


当您说“确定objectType是否为枚举”时,您基本上是要检查objectType是否为“ MyEnum”,而不仅仅是其他任何枚举。那是对的吗?
Pawan Mishra

否,我想检查是否为Enum。@minitech的答案是我想要的。
Bryan Migliorisi

Answers:


234

使用IsEnum属性:

if(objectType.IsEnum) {
    return true;
}

62
或只是return objectType.IsEnum
Andrew Whitaker

7
@AndrewWhitaker:我认为自从方法被调用以来CanConvert,它会检查多种可能的转换,而不仅仅是它是否是enum。否则,您也可以只使用IsEnum属性本身。
Ry-

5
@BryanMigliorisi:非常欢迎:)确保始终浏览IntelliSense,我从中学到了很多。
Ry-

9
@@ SergeyMetlov在PCL中,您可以使用objectType.GetTypeInfo()。IsEnum
AlexanderMüller

如果(myObject是Enum)怎么样
Nick Kovalsky


1

我通过过多地关注[Description]来完全误解了这个问题,因此,如果您要检查特定枚举是否具有[description]属性(万一json在没有属性的情况下适合),这就是一种检查方式:

public override bool CanConvert(Type objectType)
{
    FieldInfo[] fieldInfo = objectType.GetFields(BindingFlags.Public | BindingFlags.Static);

    if( fieldInfo.Length > 0 )
    {
        return ( fieldInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),false).Length > 0 );
    }
    else
    {
        return false;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.