Перевірте, чи даний тип є Enum


117

Я пишу JsonConverter для Json.NET, який повинен дозволити мені конвертувати будь-які перерахунки до рядкового значення, визначеного атрибутом [Опис].

Наприклад:

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", ви, головним чином, хочете перевірити, чи є typeType "MyEnum", а не будь-який інший перелік. Це правильно?
Pawan Mishra

Ні, я не хочу перевіряти, чи це Enum. @ minitech відповідь - це те, що я шукаю.
Брайан Мігліорісі

Відповіді:


234

Використовуйте IsEnumмайно:

if(objectType.IsEnum) {
    return true;
}

62
або простоreturn objectType.IsEnum
Ендрю Уітакер

7
@AndrewWhitaker: Я зрозумів, що оскільки метод викликається CanConvert, він перевірить численні різні можливі перетворення, а не лише, якщо це enum. Інакше ви можете просто скористатися самим IsEnumмайном.
Ри-

5
@BryanMigliorisi: Вас дуже вітають :) Обов’язково завжди переглядайте IntelliSense, я багато чого навчився з цього.
Ри-

9
@SergeyMetlov в PCL ви можете використовувати objectType.GetTypeInfo (). IsEnum
Олександр Мюллер

як бій, якщо (myObject is Enum)
Нік Ковальський


1

Я повністю неправильно трактував питання, зосередившись надто на [Описі], тож у випадку, коли ви хочете перевірити, чи має певний перелік атрибут [опис] чи ні (у випадку, якщо 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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.