Ü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?

Antworten:


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

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;
}

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


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.