2014-11-24 51 views
6

我作爲一個IEnumerable<T>Enum個列表,我需要循環,在每個項目並獲取其描述是這樣的:轉換通用牛逼到System.Enum

IEnumerable<T> values = (T[])Enum.GetValues(typeof(T)); 
foreach (Enum value in values) 
{ 
    String mylist = Common.MyExtensions.getEnumDescription(value); 
} 

... 

public static string getEnumDescription(Enum value) 
{ 
    FieldInfo fi = value.GetType().GetField(value.ToString()); 

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

    if (attributes != null && attributes.Length > 0) 
    { 
     return attributes[0].Description; 
    } 
    else 
     return value.ToString(); 
} 

這在部分的foreach將產生錯誤

不能 「T」 轉換爲System.Enum。

是不是IEnumerable排在第一位的是System.Enum? 什麼樣的演員可以做到這一點?

+0

爲什麼不使用'T'? – 2014-11-24 09:06:40

+0

不應該使用T嗎? – 2014-11-24 09:07:03

+0

也許嘗試沒有鑄造。像這樣:var values = Enum.GetValues(typeof(T)); – 2014-11-24 09:07:50

回答

-1
foreach(var e in values) 
{ 
    if(e is Enum) 
    { 
     Enum eAsEnum = (Enum)e; 
     String mylist = Common.MyExtensions.getEnumDescription(eAsEnum); 
    } 
} 
+2

這仍然會在cast'Enum eAsEnum =(Enum)e時給出相同的錯誤; ' – 2014-11-24 09:14:33

0

考慮使用類型T,你已經有工作...

IEnumerable<T> values = (T[])Enum.GetValues(typeof(T)); 
foreach (T value in values) 
{ 
    String mylist = Common.MyExtensions.getEnumDescription(value); 
} 

你也將不得不作出getEnumDesciption一般爲好。

+1

那麼會發生同樣的錯誤在不同的地方:'getEnumDescription(值);' – 2014-11-24 09:09:22

4

是不是IEnumerable的一個排在首位System.Enum的名單?什麼樣的演員可以做到這一點?

是的,但是編譯器不能確保這一點。 T可以是運行時的任何東西。在這樣的情況下,您通常使用泛型類型約束,但是where T : Enum是無效的,所以你可以做的是:

  1. 不要讓你的方法通用的,如果你想枚舉工作改變參數類型Enum
  2. 使用where T : struct約束至少確保T是值類型和檢查類型爲Enum你的方法裏面,如果它不拋出異常等。(這是不推薦)
+3

關於第一個解決方案:它會需要一些更多的工作:'Enum.GetValues(T)''那裏是t'運行時'Type'實例,不能轉換爲'Enum []'。對於第二種解決方案:它不告訴OP如何擺脫關於'T'和'Enum'之間轉換的編譯時錯誤。 – hvd 2014-11-24 09:15:22

2

的一種方式做演員是:

Enum enumValueError = (Enum)value; 
//compiler error: Cannot convert type 'xxx' to 'System.Enum' 
Enum enumValueNoError = value as Enum; 
//no error, but enumValueNoError will be null if value is not an Enum 
+0

或者['(int)(object)value'](http://xboxforums.create.msdn.com/forums/t/28060.aspx) – KyleMit 2017-12-22 21:19:40

0

我猜你在尋找這樣的事情(變更實施了一下):

public enum Test 
{ 
    [Description("This")] 
    A, 
    B, 
    C, 
    D 
} 

private IEnumerable<string> GetEnumDescription<T>() 
{ 
    var type = typeof(T); 

    if (!type.IsEnum) throw new ArgumentException("Only Enum types allowed"); 

    foreach (var value in Enum.GetValues(type).Cast<Enum>()) 
    { 
     yield return getEnumDescription(value); 
    } 
} 

public string getEnumDescription(Enum value) 
{ 
    FieldInfo fi = value.GetType().GetField(value.ToString()); 

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

    if (attributes != null && attributes.Length > 0) 
    { 
     return attributes[0].Description; 
    } 
    else 
    { 
     return value.ToString(); 
    } 
} 

和呼叫的樣子:

var desc = GetEnumDescription<Test>(); // "This", "B", "C", "D"