web-dev-qa-db-ja.com

C#でジェネリック型から列挙型にキャストできますか?

データベースから整数を取得し、型指定された列挙型をアプリケーションに返すユーティリティ関数を書いています。

これが私がやろうとしたことです(実際の関数ではintの代わりにデータリーダーと列名を渡していることに注意してください):

public static T GetEnum<T>(int enumAsInt)
{
    Type enumType = typeof(T);

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
    if (Enum.IsDefined(enumType, value) == false)
    {
        throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString());
    }

    return (T)value;
}

ただし、(T)valueをキャストすることはできません。

タイプ「System.Enum」を「T」に変換できません。

また、私はEnum.IsDefinedの使用に関するかなりの混合レビューを読みました。パフォーマンスに関しては、非常に貧弱に聞こえます。他にどのようにして有効な値を保証できますか?

43
Justin

このような:

return (T)(object)value;
67
SLaks

これを変える:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);

これに:

T value = (T)Enum.ToObject(enumType, enumAsInt);

キャストを削除します:)

17
porges

詳細については、ジェネリック制約Enumの使用はC#7.3以降で利用できます。

0
Elisabeth