我想创建一个将任何枚举转换为Json字符串的扩展方法。
我希望能够将一个扩展方法附加到Enum,我可以将枚举类型传入其中,以便可以Enum
调用它,方法是调用{{1} },所以看起来像:
Enum.GetValues(Type enumType)
似乎这是不可能的 - Enum是一个抽象类;你怎么能扩展呢? - 而且我必须创建自己的静态类型来实现它。
任何人都可以确认我不能以这种方式扩展Enum(请在技术上解释原因)或者告诉我我该怎么做?
澄清(更新)
我知道我可以用自己的静态类型做到这一点。例如,创建Enum.ToJsonString(Type enumType)
会相当容易,但我宁愿将此方法与GetValues()等一起列在VS intellisence auto-complete中。
答案 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();