2015-08-25 87 views
4

我繼承有大量的代碼定義枚舉的網絡API,我想將它們轉換爲被稱爲EnumView一個視圖模型類,使他們能夠如下連載...通用枚舉約束

{ID:,名稱:enumName}

public class EnumView 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

在限制泛型類枚舉類型,我得到的警告

約束不能特殊類的System.Enum'

這是我要使用通用的轉換器...

public class EnumViewConverter<T> where T : Enum 
{ 
    public static List<EnumView> ConvertToView() 
    { 
     List<EnumView> enumViews = new List<EnumView>(); 

     T[] enumValues = (T[])Enum.GetValues(typeof(T)); 

     foreach (var enumValue in enumValues) 
     { 
      var enumView = new EnumView 
      { 
       Id = (int)enumValue, 
       Name = Enum.GetName(typeof(T), enumValue) 
      }; 

      enumViews.Add(enumView); 
     } 
     return enumViews; 
    } 
} 

沒有T與約束到一個枚舉,下面的轉換不編譯...

編號=(int)的enumValue,

由於缺乏泛型約束的問題,最好的方法是什麼?

+0

好吧,你有一個定義枚舉,但你打算怎麼使用它?通過回答這個問題,我們找到了轉換的目的,然後我們可以想出一個解決方案 – Hamed

+0

@leppie - 我在發佈之前已經閱讀過這個問題/答案,但是並不認爲它真的回答了我的問題。 – Will

+0

@Hamed不知道你在做什麼 - EnumView將在API中被序列化。枚舉用於服務器端代碼... – Will

回答

3

你可以使用:身份證= Convert.ToInt32(enumValue),而不是鑄造(INT)

如果你想添加一些「約束」來檢查的編譯,你可以設置的類型「,其中T :struct'它至少可以防止設置類的類型。

+0

謝謝,我以爲我已經測試過了,它沒有工作;無論如何,再次嘗試,你發現。 – Will

0

在我使用的結束......

public static class EnumViewConverter<T> where T : struct 
{ 
    public static List<EnumView> ConvertToView() 
    { 
     if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); 

     List<EnumView> enumViews = new List<EnumView>(); 

     T[] enumValues = (T[])Enum.GetValues(typeof(T)); 

     foreach (var enumValue in enumValues) 
     { 
      var enumView = new EnumView 
      { 
       Id = Convert.ToInt32(enumValue), 
       Name = Enum.GetName(typeof(T), enumValue) 
      }; 

      enumViews.Add(enumView); 
     } 
     return enumViews; 
    } 
} 

由...

var views = EnumViewConverter<FooBarEnum>.ConvertToView(); 

感謝所有幫助調用,可以發誓我想這早些時候:(

0

爲了擴展我先前的評論,this answer中描述的技術使用一個嵌套類,該類具有依賴於其父類的通用參數來模擬通用Enum約束條件。雖然這並不

var view = EnumConverter.ViewConverter<SomeEnum>.ConvertToView(); 

:ü可以使用這種方法在這裏:

public abstract class ConverterClassUtils<TClass> 
    where TClass : class 
{ 
    public class ViewConverter<TInner> where TInner : struct, TClass 
    { 
     public static List<EnumView> ConvertToView() 
     { 
      List<EnumView> enumViews = new List<EnumView>(); 

      TInner[] enumValues = (TInner[])Enum.GetValues(typeof(TInner)); 

      foreach (var enumValue in enumValues) 
      { 
       var enumView = new EnumView 
       { 
        Id = (int)(object)enumValue, 
        Name = Enum.GetName(typeof(TInner), enumValue) 
       }; 

       enumViews.Add(enumView); 
      } 
      return enumViews; 
     } 
    } 
} 

public class EnumConverter : ConverterClassUtils<Enum> { } 

那麼下面編譯

var view = EnumConverter.ViewConverter<int>.ConvertToView(); 
+0

感謝您擴展您的建議,最終我使用下面的代碼,因爲它更簡單。謝謝你的幫助。 – Will