Проверить, является ли данный Тип перечислением

117

Я пишу JsonConverter для Json.NET, который должен позволить мне преобразовать любое перечисление в строковое значение, определенное атрибутом [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является ли он, Enumи вернуть истину, чтобы конвертер знал, что он может преобразовать этот объект. Поскольку у меня их много Enum, я не могу явно проверить каждый из них, поэтому я надеялся на более общий способ сделать это.

Брайан Миглиориси
источник
Когда вы говорите «определить, является ли objectType Enum», вы в основном хотите проверить, является ли objectType «MyEnum», а не просто любым другим перечислением. Это правильно?
Паван Мишра
Нет, я хочу проверить, является ли это Enum. Ответ @minitech - это то, что я ищу.
Bryan Migliorisi

Ответы:

234

Используйте IsEnumсвойство:

if(objectType.IsEnum) {
    return true;
}
Ry-
источник
62
или простоreturn objectType.IsEnum
Эндрю Уитакер
7
@AndrewWhitaker: Я подумал, что, поскольку метод вызывается CanConvert, он будет проверять несколько различных возможных преобразований, а не только то, что это enum. В противном случае вы можете просто использовать само IsEnumсвойство.
Ry-
5
@BryanMigliorisi: Добро пожаловать :) Всегда просматривайте IntelliSense, я многому научился.
Ry-
9
@SergeyMetlov в PCL вы можете использовать objectType.GetTypeInfo (). IsEnum
Александр Мюллер
как насчет if (myObject is Enum)
Ник Ковальский
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;
    }
}
Том
источник