2012-07-30 91 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; 
    } 

因此,你將有列表的具體枚舉