2014-01-23 121 views
5

以下是我的代碼將枚舉值轉換爲字典。如何爲Enum類型參數創建擴展方法?

public static Dictionary<string, string> EnumToDictionary<T>() where T : struct, IConvertible 
    { 
     var oResult = new Dictionary<string, string>(); 
     if (typeof(T).IsEnum) 
      foreach (T oItem in Enum.GetValues(typeof(T))) 
       oResult.Add(oItem.ToString(), oItem.ToString()); 
     return oResult; 
    } 

,這是我的枚舉

public enum MyEnum 
{ 
    Value1, 
    Value2, 
    value3 
} 

目前我打電話像

var result=EnumToDictionary<MyEnum>(); 

這種方法,但我需要使用的方法類似

var result=MyEnum.EnumToDictionary(); 

或任何其他方式像字符串擴展方法DS。

+0

查看https://code.google.com/p/unconstrained-melody/ –

+1

@JonSkeet這不是他要問的。他希望有一種「擴展方法」適用於枚舉類型,而不是枚舉成員。這是不可能的,也沒有真正需要這種語法。 –

+0

@EliArbel:哦,我明白了 - 就這個類型本身而言。對,不理我。 –

回答

3

一般來說你的問題與您要創建一個通用的擴展方法(這是可能的),但沒有調用該方法時所發送的「這個」參數的任何對象引用的事實連接(這是不可能的)。 所以使用擴展方法不是實現你想要的選項。

你可以做某事像這樣:

public static Dictionary<string, string> EnumToDictionary(this Enum @enum) 
{ 
    var type = @enum.GetType(); 
    return Enum.GetValues(type).Cast<string>().ToDictionary(e => e, e => Enum.GetName(type, e)); 
} 

但是,這將意味着你需要在枚舉類的一定實例操作來調用這樣的擴展方法。

或者你可以這樣做:

public static IDictionary<string, string> EnumToDictionary(this Type t) 
    { 
     if (t == null) throw new NullReferenceException(); 
     if (!t.IsEnum) throw new InvalidCastException("object is not an Enumeration"); 

     string[] names = Enum.GetNames(t); 
     Array values = Enum.GetValues(t); 

     return (from i in Enumerable.Range(0, names.Length) 
       select new { Key = names[i], Value = (int)values.GetValue(i) }) 
        .ToDictionary(k => k.Key, k => k.Value.ToString()); 
    } 

然後調用它像這樣:

var result = typeof(MyEnum).EnumToDictionary(); 
+0

謝謝。得到我想要的。 –

1

你可以寫一個擴展方法,像:

public static IDictionary<string, string> ToDictionary(this Enum value) 
    { 
     var result = new Dictionary<string, string>(); 
      foreach (var item in Enum.GetValues(value.GetType())) 
       result.Add(Convert.ToInt64(item).ToString(), item.ToString()); 
     return result; 
    } 

但是要調用這樣的擴展方法,您需要提供所需枚舉的實例。例如。

 var dict = default(System.DayOfWeek).ToDictionary(); 
+0

我也嘗試了很多方法來做到這一點。這也是其中之一,但我錯過了'var dict = default(System.DayOfWeek).ToDictionary();'。 這對我來說是完美的。 謝謝。 –

相關問題