Перевірка, чи екземпляр Type є перерахованим перерахуванням у C #


83

Як я можу перевірити, чи є Type типовим переліченням в C # щось на зразок

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?

Відповіді:


169
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}

44

EDIT: Я збираюся залишити цю відповідь, оскільки вона спрацює, і вона демонструє кілька дзвінків, про які читачі можуть і не знати. Однак відповідь Луки, безумовно, приємніша - підйміться за :)

Ви можете зробити:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}

Думаю, я зробив би це за Люком; менш складний для абонента.
Марк Гравелл

2
@Marc: Я не бачу, як це робить якісь шанси для абонента - але спосіб Люка, безумовно, приємніший за мене.
Джон Скіт,

Так, безумовно, збережіть його для подальшого використання
адрін

Так. Я б зробив "загальнодоступний статичний bool IsNullableEnum (значення об'єкта) {if (value == null) {return true;} Введіть t = value.GetType (); return / * те саме, що повернення Джона * /;}", оскільки це може робота з коробковими типами. А потім перевантажений відповіддю LukeH для кращої роботи.
TamusJRoyce,

15

З C # 6.0 прийняту відповідь можна змінити як

Nullable.GetUnderlyingType(t)?.IsEnum == true

== true потрібно для перетворення bool? охолодити


1
public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

Я пропустив IsEnumперевірку, яку ви вже зробили, оскільки це робить цей метод більш загальним.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.