我能像Enum.GetValues()一样扩展枚举吗?

17 浏览
0 Comments

我能像Enum.GetValues()一样扩展枚举吗?

这个问题已经有答案了:

我能为现有的静态类添加扩展方法吗?

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

我想能够将扩展方法附加到枚举中,我可以将枚举类型传递给它,以便可以在 Enum 上调用,就像你可以调用 Enum.GetValues(Type enumType) 一样,所以它可能看起来像:

Enum.ToJsonString(Type enumType)

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

有人可以证实我无法以这种方式扩展枚举(并请解释一下技术上的原因),或者告诉我如何才能做到?

澄清(更新)

我知道我可以使用自己的静态类型来完成这个操作。例如,可以相当容易地创建 EnumExtensions.ToJsonString(Type enumType),但我更愿意在 VS 智能感应自动完成中将它列在 GetValues() 等方法旁边。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这怎么样?你不能把它作为扩展实现,因为在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);
}

0
0 Comments

作为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}

0