我能像Enum.GetValues()一样扩展枚举吗?
我能像Enum.GetValues()一样扩展枚举吗?
这个问题已经有答案了:
我想创建一个扩展方法,将任何枚举转换为Json字符串。
我想能够将扩展方法附加到枚举中,我可以将枚举类型传递给它,以便可以在 Enum
上调用,就像你可以调用 Enum.GetValues(Type enumType)
一样,所以它可能看起来像:
Enum.ToJsonString(Type enumType)
似乎这是不可能的--枚举是抽象类;你怎么扩展它呢?--而且我将不得不创建自己的静态类型来实现这一点。
有人可以证实我无法以这种方式扩展枚举(并请解释一下技术上的原因),或者告诉我如何才能做到?
澄清(更新)
我知道我可以使用自己的静态类型来完成这个操作。例如,可以相当容易地创建 EnumExtensions.ToJsonString(Type enumType)
,但我更愿意在 VS 智能感应自动完成中将它列在 GetValues() 等方法旁边。
这怎么样?你不能把它作为扩展实现,因为在C#中你不能静态扩展(在撰写本文时)。
请注意,如果两个枚举成员具有相同的值(这是不寻常但有效的情况),该代码也能正常工作。
public static string ToJson() { var enumType = typeof(TEnum); if (!enumType.IsEnum) { throw new ArgumentException("enumType"); } var names = Enum.GetNames(enumType); var values = Enum.GetValues(enumType).OfType () .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); }
作为C#定义的扩展方法:\n\n扩展方法使你能够\"添加\"方法到现有的类型,而不用创建一个新的派生类型,重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型的实例方法。\n\n它们应该像类型的实例方法一样被调用。Enum是一个类型名称,你正在尝试编写一个看起来像类型的静态成员的扩展,这是不可能的。\n\n你可以做的是一个通用方法,它将接受枚举类型并将枚举值转换为JSON:\n\n
public static string GetEnumJson() 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); }
\n\n并与以下一起使用:\n\n
var json = GetEnumJson();
\n\n或者如果你在JsonHelper类中有这个方法,我会选择一个名字叫GetEnumMembers的方法,并这样调用它:\n\n
var json = JsonHelper.GetEnumMembers();
\n\n结果如下:\n\n{\"Sunday\":0,\"Monday\":1,\"Tuesday\":2,\"Wednesday\":3,\"Thursday\":4,\"Friday\":5,\"Saturday\":6}