Can I extend Enum a la Enum.GetValues()?
我想创建一个扩展方法,将任何枚举转换为JSON字符串。
我希望能够将一个扩展方法附加到我可以将枚举类型传递到的枚举中,以便可以以调用
1 | Enum.ToJsonString(Type enumType) |
似乎这是不可能的——枚举是一个抽象类;如何扩展它?--我必须创建自己的静态类型来实现这一点。
是否有人可以确认我不能这样扩展枚举(并且请从技术上解释为什么),或者告诉我如何扩展枚举?
澄清(更新)
我知道我可以用我自己的静态类型来实现这一点。例如,创建
作为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.
应该调用它们,因为它们是类型的实例方法。
您可以做的是泛型方法,它将接受枚举类型并将枚举值转换为JSON:
1 2 3 4 5 6 7 8 9 10 11 12 |
并与之一起使用
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 |