web-dev-qa-db-fra.com

Vérification si l'instance de type est une énumération nullable en C #

Comment puis-je vérifier si un type est une énumération nullable en C # quelque chose comme

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?
81
adrin
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}
164
LukeH

EDIT: Je vais laisser cette réponse car elle fonctionnera, et elle démontre quelques appels que les lecteurs ne connaissent pas autrement. Cependant, la réponse de Luke est certainement plus agréable - allez-y voter :)

Tu peux faire:

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

A partir de C # 6.0, la réponse acceptée peut être refactorisée comme

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

Le == true est nécessaire pour convertir bool? bool

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

J'ai omis la vérification de IsEnum que vous avez déjà effectuée, car cela rend cette méthode plus générale.

1
Bryan Watts
1
Daniel Renshaw