3

null許容データベースの列から列挙型を解析するメソッドが欲しいのですが。私はこのメソッドを以下に書きました(そしてそれをコンパイルするためにTを構造体に制限しなければなりませんでした)。

コンパイルはしますが、列挙型は構造体ではないので間違っていると思いますか?もしそうなら、ジェネリックメソッドを制限して、ValueTypeを期待していると言うにはどうすればよいですか?

private static T? ParseEnum<T>(DataRow row, string columnName)
    where T : struct
{
    T? value = null;
    try
    {
        if (row[columnName] != DBNull.Value)
        {
            value = (T)Enum.Parse(
                typeof(T),
                row[columnName].ToString(),
                true);
        }
    }

    catch (ArgumentException) { }

    return value;
}
4

2 に答える 2

4

残念ながら、C#には、特定の型が列挙型であることを制限できる制約はありません。しかし、ILにはそのような概念があります。ジョンはそれについてブログに書いた

于 2012-07-30T10:07:00.323 に答える
2

動的を使用して、実行時に列挙型のジェネリックリストを作成してみてください。

    public static dynamic ToValues(this Type enumType)
    {
        var values = Enum.GetValues(enumType);
        Type list = typeof(List<>);
        Type resultType = list.MakeGenericType(enumType);
        dynamic result =  Activator.CreateInstance(resultType);
        foreach (var value in values)
        {
            dynamic concreteValue = Enum.Parse(enumType, value.ToString());
            result.Add(concreteValue);
        }
        return result;
    }

その結果、具体的な列挙型のリストが表示されます

于 2012-07-31T00:30:28.760 に答える