Type 인스턴스가 C #에서 nullable 열거 형인지 확인


85

Type이 C #에서 nullable 열거 형인지 어떻게 확인합니까?

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

답변:


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

44

편집 : 나는 그것이 작동 할 것이므로이 대답을 남겨두고 독자가 그렇지 않으면 알지 못할 몇 가지 호출을 보여줍니다. 그러나 Luke의 대답 은 확실히 더 좋습니다-upvote it :)

넌 할 수있어:

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

루크의 방식으로했을 것 같아요. 발신자에게는 덜 복잡합니다.
Marc Gravell

2
@Marc : 발신자 에게 어떤 승산이 있는지는 모르겠지만 Luke의 방식은 확실히 저보다 더 좋습니다.
Jon Skeet

예, 향후 참조를 위해 확실히 보관하십시오
adrin

네. 나는 "public static bool IsNullableEnum (object value) {if (value == null) {return true;} Type t = value.GetType (); return / * same as Jon 's return * /;}"을 수행했을 것입니다. 박스형으로 작업합니다. 그리고 더 나은 성능을 위해 LukeH 답변으로 과부하가 걸립니다.
TamusJRoyce 2012 년

16

C # 6.0에서 허용되는 답변은 다음과 같이 리팩터링 될 수 있습니다.

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

bool을 변환하려면 == true가 필요합니까? 부울


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

IsEnum이 방법을 더 일반적으로 만들기 때문에 이미 확인한 수표 는 생략했습니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.