我可以扩展Enum a la Enum.GetValues()吗?

时间:2014-02-18 12:19:17

标签: c#

我想创建一个将任何枚举转换为Json字符串的扩展方法。

我希望能够将一个扩展方法附加到Enum,我可以将枚举类型传入其中,以便可以Enum调用它,方法是调用{{1} },所以看起来像:

Enum.GetValues(Type enumType)

似乎这是不可能的 - Enum是一个抽象类;你怎么能扩展呢? - 而且我必须创建自己的静态类型来实现它。

任何人都可以确认我不能以这种方式扩展Enum(请在技术上解释原因)或者告诉我我该怎么做?

澄清(更新)

我知道我可以用自己的静态类型做到这一点。例如,创建Enum.ToJsonString(Type enumType) 会相当容易,但我宁愿将此方法与GetValues()等一起列在VS intellisence auto-complete中。

3 个答案:

答案 0 :(得分:5)

在C#中定义extension methods

  

扩展方法使您可以向现有类型“添加”方法   无需创建新的派生类型,重新编译或其他方式   修改原始类型。扩展方法是一种特殊的方法   静态方法,但它们被称为就像实例方法一样   扩展类型。

应该调用它们,因为它们是类型的实例方法。 Enum是一个类型名称,您正在尝试编写类似于静态成员类型的扩展名,不可能

您可以做的是泛型方法,它将接受枚举类型并将枚举值转换为JSON:

public static string GetEnumJson<T>()
    where T : struct
{
    Type type = typeof(T);
    if (!type.IsEnum)
        throw new NotSupportedException();

    var members = Enum.GetNames(type)
                      .ToDictionary(s => s, s => Enum.Parse(type, s));

    return JsonConvert.SerializeObject(members);
}

并与

一起使用
var json = GetEnumJson<DayOfWeek>();

或者如果你在类JsonHelper中有这个方法,那么我会使用名称GetEnumMembers和 这样叫:

var json = JsonHelper.GetEnumMembers<DayOfWeek>();

结果:

  

{ “星期日”:0, “星期一”:1, “星期二”:2 “星期三”:3 “星期四”:4, “星期五”:5 “星期六”:6}

答案 1 :(得分:2)

如何做到这一点,你不能把它作为一个扩展,因为你不能在c#中做静态扩展(在撰写本文时)。

注意,如果两个枚举成员具有相同的值(这是不寻常但有效的),则此代码有效。

public static string ToJson<TEnum>()
{
    var enumType = typeof(TEnum);
    if (!enumType.IsEnum)
    {
        throw new ArgumentException("enumType");
    }

    var names = Enum.GetNames(enumType);
    var values = Enum.GetValues(enumType).OfType<Enum>()
        .Select(e => Convert.ChangeType(e, e.GetTypeCode()));
    var members = names.Zip(values, (k, v) => new { k, v })
        .ToDictionary(p => p.k, p => p.v);

    return JsonConvert.SerializeObject(members);
}

答案 2 :(得分:1)

您可以为所有类型添加扩展名,并在内部检查是否枚举如此

static class EnumEx
{
    public static string ToJsonString(this Type enumType)
    {
        if(!enumType.IsEnum)
            throw new ArgumentException("Type should be enum");

        return /* create json string from enum type */
    }
}

并像

一样使用它
enum MyEnum
{
    MyValue1,
    MyValue2,
}

....

var json = typeof(MyEnum).ToJsonString();