关于c#:我可以将Enum扩展为Enum.GetValues()吗?


Can I extend Enum a la Enum.GetValues()?

本问题已经有最佳答案,请猛点这里访问。

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

我希望能够将一个扩展方法附加到我可以将枚举类型传递到的枚举中,以便可以以调用Enum.GetValues(Type enumType)的方式在Enum上调用它,因此它可能看起来像:

1
Enum.ToJsonString(Type enumType)

似乎这是不可能的——枚举是一个抽象类;如何扩展它?--我必须创建自己的静态类型来实现这一点。

是否有人可以确认我不能这样扩展枚举(并且请从技术上解释为什么),或者告诉我如何扩展枚举?

澄清(更新)

我知道我可以用我自己的静态类型来实现这一点。例如,创建EnumExtensions.ToJsonString(Type enumType)是相当容易的,但我宁愿将方法与getValues()et al一起列出,vs intellisence auto complete一起完成。


作为C中定义的扩展方法:

Extension methods enable you to"add" methods to existing types
without creating a new derived type, recompiling, or otherwise
modifying the original type. Extension methods are a special kind of
static method, but they are called as if they were instance methods on
the extended type.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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);
}

并与之一起使用

1
var json = GetEnumJson<DayOfWeek>();

或者如果您在类jsonHelper中有这个方法,那么我将使用getEnumMembers和请这样称呼:

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

结果:

{"Sunday":0,"Monday":1,"Tuesday":2,"Wednesday":3,"Thursday":4,"Friday":5,"Saturday":6}


怎么样,你不能把它作为扩展来做,因为你不能用C语言做静态扩展(在写的时候)。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
}


您可以向所有类型和内部添加扩展,检查它是否枚举如下

1
2
3
4
5
6
7
8
9
10
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 */
    }
}

并使用它

1
2
3
4
5
6
7
8
9
enum MyEnum
{
    MyValue1,
    MyValue2,
}

....

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