如何为Enum类型参数创建扩展方法?

时间:2014-01-23 11:31:19

标签: c# enums extension-methods

以下是将枚举值转换为字典的代码。

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();

或任何其他方式,如字符串扩展方法。

2 个答案:

答案 0 :(得分:4)

一般来说,你的问题与你想要创建一个通用的扩展方法(这是可能的)有关,但是在调用这样的方法时没有任何对象引用作为“this”参数发送(这是不可能的)。 因此,使用扩展方法不是实现您想要的选项。

你可以这样做:

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();

答案 1 :(得分: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;
    }

但是要调用这样的扩展方法,您需要提供所需枚举的实例。 E.g。

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