web-dev-qa-db-ja.com

TypeインスタンスがC#のnull可能な列挙型かどうかを確認する

TypeがC#でnull可能な列挙型かどうかを確認する方法

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?
81
adrin
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}
164
LukeH

編集:私はこの答えが機能するのでそのままにしておきます、そしてそれは読者がそうでなければ知らないかもしれないいくつかの呼び出しを示します。ただし、 ルークの答え の方が間違いなく優れています-賛成投票してください:)

できるよ:

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

C#6.0以降、受け入れられた回答は次のようにリファクタリングできます。

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

ブール値を変換するには== trueが必要ですか?ブールする

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

IsEnumチェックは省略しました。これにより、この方法がより一般的になります。

1
Bryan Watts
1
Daniel Renshaw