检查Type实例在C#中是否为可为空的枚举


83

我如何在C#中检查类型是否为可为空的枚举,例如

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

Answers:


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

44

编辑:我将保留此答案,因为它将起作用,它演示了一些读者可能不知道的电话。但是,卢克的答案肯定更好-请投票:)

你可以做:

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

我想我已经做到了卢克的方式;对于呼叫者来说不太复杂。
马克·

2
@Marc:我不知道这如何给来电者带来任何麻烦-但是Luke的方式肯定比我的好。
乔恩·斯基特

是的,一定要保留它以备将来参考
adrin

是的 我会做“公共静态布尔IsNullableEnum(对象值){如果(value == null){return true;}类型t = value.GetType(); return / *与Jon的return * /;}相同,因为它可能使用盒装类型。然后,使用LukeH答案进行重载以获得更好的性能。
TamusJRoyce'5

15

从C#6.0开始,可以将接受的答案重构为

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

转换布尔值需要== true吗?布尔


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

我遗漏了IsEnum您已经做过的检查,因为这使此方法更加通用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.