TypeインスタンスがC#でnull許容の列挙型であるかどうかを確認する


83

タイプがC#のnull許容列挙型であるかどうかを確認するにはどうすればよいですか?

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

回答:


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

私はそれをルークのやり方でやったと思います。発信者にとってはそれほど複雑ではありません。
MarcGravell

2
@マーク:それが発信者にどのようにオッズをもたらすかはわかりませんが、ルークのやり方は確かに私のものよりも優れています。
Jon Skeet 2010

ええ、将来の参考のために間違いなくそれを保管してください
adrin 2010

ええ。"public static bool IsNullableEnum(object value){if(value == null){return true;} Type t = value.GetType(); return / * Jonのreturnと同じ* /;}"を実行したと思います。ボックス型で動作します。そして、パフォーマンスを向上させるためにLukeHの回答で過負荷になります。
TamusJRoyce 2012年

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この方法がより一般的になるため、すでに行ったチェックは省略しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.