2017-11-06 4 views
1

Ich habe die folgenden zwei Methoden in meinem Code, der im Grunde eine ENUM in eine Dictionay von ints und Streichern drehen:Wie erstellt man eine generische Enum-Methode?

public Dictionary<int, string> GetChannelLevels() 
    { 
     IEnumerable<ChannelLevel> enumValues = Enum.GetValues(typeof(ChannelLevel)).Cast<ChannelLevel>(); 

     var channelLevels = enumValues.ToDictionary(value => (int)value, value => value.ToString()); 

     return channelLevels; 
    } 


    public Dictionary<int, string> GetCategoryLevels() 
    { 
     IEnumerable<CategoryLevel> enumValues = Enum.GetValues(typeof(CategoryLevel)).Cast<CategoryLevel>(); 

     var channelLevels = enumValues.ToDictionary(value => (int)value, value => value.ToString()); 

     return channelLevels; 
    } 

Da der Code dieser zwei Methoden im Grunde das gleiche ist, dachte ich, ein generisches Verfahren zum Schreiben die wie folgt aussehen würde:

private Dictionary<int, string> GetEnumDictionary<T>() where T : struct, IConvertible 
    { 
     if (!typeof(T).IsEnum) 
     { 
      throw new ArgumentException("T must be an enumerated type"); 
     } 



     IEnumerable<T> enumValues = Enum.GetValues(typeof(T)).Cast<T>(); 

     var channelLevels = enumValues.ToDictionary(value => /*THIS IS WHERE THE PROBLEM IS*/ (int)value, value => value.ToString()); 

     return channelLevels; 

    } 

Das Problem ist, dass, da C# nicht eine generische enum hat constaints die Methode cann't T als enum erkennen und deshalb cann't ich convery in int.

Wie kann ich dieses Problem lösen, ohne eine neue Funktion zu schreiben?

+1

Warum möchten Sie eine generische Methode, wenn Sie am Ende * Casting *? In jedem Fall sind alle enums Instanzen des [System.Enum] (https://docs.microsoft.com/en-us/dotnet/api/system.enum?view=netframework-4.7.1) type –

+1

Mögliche Duplikate von [Enum zu Dictionary C#] (https://stackoverflow.com/questions/5583717/enum-to-dictionary-c-sharp) –

+0

@JamesThorpe danke für den Link. Ich denke, dass ich das Problem lösen kann, indem ich die Funktion so –

Antwort

0

Wie @thmshd schlug ich das explizite Int Casting mit Convert.ToInt32 ersetzt und es scheint das Problem zu lösen. So ist die endgültige Version der Methode:

private Dictionary<int, string> GetEnumDictionary<T>() where T : struct, IConvertible 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new ArgumentException("T must be an enumerated type"); 
    } 

    IEnumerable<T> enumValues = Enum.GetValues(typeof(T)).Cast<T>(); 

    var enumDictionary = enumValues.ToDictionary(value => Convert.ToInt32(value), value => value.ToString()); 

    return enumDictionary; 
} 
Verwandte Themen