Проверка, является ли экземпляр типа обнуляемым перечислением в C # - PullRequest
78 голосов
/ 27 апреля 2010

Как мне проверить, является ли тип перечисляемым в N # что-то вроде

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

Ответы [ 5 ]

153 голосов
/ 27 апреля 2010
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}
41 голосов
/ 27 апреля 2010

РЕДАКТИРОВАТЬ: Я собираюсь оставить этот ответ, поскольку он будет работать, и он демонстрирует несколько звонков, о которых читатели могут не знать иначе.Тем не менее, ответ Люка определенно лучше - иди, скажи ему:)

Вы можете сделать:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}
9 голосов
/ 12 апреля 2016

Начиная с C # 6.0 принятый ответ может быть изменен как

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

== true необходимо для преобразования bool? закипать

1 голос
/ 27 апреля 2010
1 голос
/ 27 апреля 2010
public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

Я пропустил проверку IsEnum, которую вы уже сделали, поскольку это делает этот метод более общим.

...