是否可以为通用枚举类型编写扩展方法?

Is it possible to write an extension method for a generic Enum type?

this Whosebug question 上,我发现了这个非常好的辅助方法,用于将字符串解析为通用枚举值:

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

我想将其从 辅助方法 更改为 扩展方法 ,但我不太熟悉使用泛型,所以我不确定 if/how 是否可行。

我试过了,但是你很快就会发现这段代码实际上并没有编译:

public static T ParseEnum(this T myEnum, string value)
{
    return (T) Enum.Parse(typeof(myEnum), value, true);
}

我也试过这个,但这也不行:

public static Enum ParseEnum(this Enum myEnum, string value)
{
    return Enum.Parse(typeof(myEnum), value, true);
}

甚至可以做我在这里问的事情吗?

在写扩展方法的时候,首先要做的就是想好如何调用它。 IE。 你要扩展什么

在解析 string 并返回 enum 值的情况下,唯一真正有意义的是扩展 string class。在那个视图中,这就是扩展方法的样子:

    public static T ParseEnum<T>(this string text)
    {
        return (T)Enum.Parse(typeof(T), text);
    }

你可以这样称呼它:

Pets pet = "Cat".ParseEnum<Pets>();

另一种方法是使用类型推断,代价是引用参数(我更愿意避免):

    public static void ParseEnum<T>(this string text, out T t)
    {
        t = (T)Enum.Parse(typeof(T), text);
    }

你可以这样称呼它:

Pets pet;

"Cat".ParseEnum(out pet);

恕我直言,这不是很好,即使你得到类型推断,因为你不能在表达式中使用方法调用。

注意语法Pets.ParseEnum("Cat")是行不通的,因为Pets是类型名称,不是类型实例,你只能基于实例进行扩展 个对象。但也许上面的例子已经足够接近了(反正输入的字符数差不多:))

您可以将辅助方法重命名为 Enum<>,使其看起来像是在扩展 Enum。

/// <summary> Enum Extension Methods </summary>
/// <typeparam name="T"> type of Enum </typeparam>
public class Enum<T> where T : struct, IConvertible
{
    public static T Parse(string input)
    {
        return (T)Enum.Parse(typeof(T), input, true);
    }
}

然后像OP提到的辅助方法一样使用它:

var result = Enum<StatusEnum>.Parse("Active");

这不是扩展方法。然而,它共享扩展方法的目标之一。将 class 命名为接近 Enum 试图帮助发现。