データベースから整数を取得し、型指定された列挙型をアプリケーションに返すユーティリティ関数を書いています。
これが私がやろうとしたことです(実際の関数では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
の使用に関するかなりの混合レビューを読みました。パフォーマンスに関しては、非常に貧弱に聞こえます。他にどのようにして有効な値を保証できますか?
このような:
return (T)(object)value;
これを変える:
Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
これに:
T value = (T)Enum.ToObject(enumType, enumAsInt);
キャストを削除します:)
詳細については、ジェネリック制約Enum
の使用はC#7.3以降で利用できます。