Überprüfen, ob die Typinstanz in C # eine nullfähige Aufzählung ist

81

Wie überprüfe ich, ob ein Typ eine nullbare Aufzählung in C # ist?

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

Antworten:

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

EDIT: Ich werde diese Antwort offen lassen, da sie funktionieren wird, und sie zeigt einige Anrufe, von denen die Leser sonst vielleicht nichts wissen. Allerdings ist Lukes Antwort definitiv besser - stimmen Sie ab :)

Du kannst tun:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}
Jon Skeet
quelle
Ich glaube, ich hätte es auf Lukes Art getan. weniger komplex für den Anrufer.
Marc Gravell
2
@Marc: Ich sehe nicht, wie es dem Anrufer Chancen gibt - aber Lukes Weg ist sicherlich schöner als meiner.
Jon Skeet
Ja, auf jeden Fall für zukünftige Referenz aufbewahren
Adrin
Ja. Ich hätte "public static bool IsNullableEnum (Objektwert) {if (Wert == null) {return true;} Typ t = value.GetType (); return / * wie Jons return * /;}" gemacht, weil es möglich ist arbeiten mit Box-Typen. Und dann mit LukeH Antwort für eine bessere Leistung überladen.
TamusJRoyce
13

Ab C # 6.0 kann die akzeptierte Antwort als umgestaltet werden

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

Das == true wird benötigt, um bool zu konvertieren? zu boolen

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

Ich habe die IsEnumPrüfung, die Sie bereits durchgeführt haben, weggelassen, da dies diese Methode allgemeiner macht.

Bryan Watts
quelle