2012-07-30 98 views
1

我想有一个方法,将从一个可空的数据库列解析一个枚举。 我在下面写了这个方法(并且必须将T限制在一个结构中才能编译)。通用可为空枚举

它确实编译,但我相信它的错误作为枚举不是结构? 如果是这样,我怎么限制泛型方法的说,我期待一个值类型,你不必在我抱怨说:“只有非空值类型可以潜在的‘System.Nullable’

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

枚举只是与顶部糖整合,所以他们确实是结构。 – Jens 2012-07-30 10:06:51

回答

3

遗憾的是没有在C#中可用的约束,使您可以限制特定类型是一个枚举。在IL有这样的想法,但。乔恩blogged about it

+1

和枚举实际上是结构 – Artiom 2012-07-30 10:10:38

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

因此,你将有列表的具体枚举