2010-11-01 80 views
0

我正在爲實體框架4中的ENUM創建包裝POCO類,如here所述。我創建了包裝的枚舉如下如何使這個代碼泛型?

public class PriorityWrapper 
    { 
     private gender _t; 
     public int Value 
     { 
      get 
      { 
       return (int)_t; 
      } 
      set 
      { 
       _t = (gender)value; 
      } 
     } 
     public gender EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public static implicit operator PriorityWrapper(gender p) 
     { 
      return new PriorityWrapper { EnumValue = p }; 
     } 

     public static implicit operator gender(PriorityWrapper pw) 
     { 
      if (pw == null) return gender.Male; 
      else return pw.EnumValue; 
     } 
    } 

但我也有其他的ENUM除了性別如上所述。我可以在這裏使用泛型,因此我可以對所有ENUM事件使用相同的代碼。

我是新來的仿製藥,所以需要專家的幫助。

回答

0

不可能擁有通用的轉換運算符。所以,上面的代碼不可能有精確的通用等價物。此外,不能提到枚舉作爲泛型類型約束,因此在屬性實現中進行轉換也是不可能的(或者可能需要一些其他約束(可能是接口)才能工作,從而導致裝箱/拆箱)。簡而言之,具有合理性能的通用解決方案可能是不可行的。

我建議您嘗試使用代碼生成(查看T4模板)來創建包裝類。 T4是很簡單 - 這裏指的幾個環節:http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

1

不能使用枚舉作爲一般的限制,而是可以使用。

public class EnumWrapper<T> 
    { 
     public static int Num = 1; 
     private T _t; 

     public T EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public void Assign<U>(U inn) where U : struct, T 
     { 
      if (typeof(T).IsEnum) 
      { 
       EnumValue = inn; 
      } 


     } 
    } 

並調用它像這樣

  var agen = new EnumWrapper<gender>(); 
      gender g=new gender() ; 
      agen.Assign (g); 

編輯:分配()是一個假設法。我的意圖是展示如何使用枚舉作爲通用約束。

+0

沒有意義。爲什麼要做agen.Assign(gender.Male),當他可以做agen.EnumValue = gender.Male? OP需要將enum從/轉換爲整數的能力。 – VinayC 2010-11-01 11:14:24

+0

@VinayC,是的,你是對的,它沒有任何意義,OP實際上被問及如何使枚舉綁定泛型類。所以我創建了一個虛擬課堂。我的意圖是向他展示如何使用枚舉作爲通用約束.... – RameshVel 2010-11-01 11:25:01

+0

@ Ramesh - 如果我需要從包裝本身返回Enum的默認值呢? – Ram 2010-11-02 09:09:37