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

soa*_*gem 1 c# generics enums

这个StackOverflow问题上,我发现了一个非常好的帮助程序方法,用于将字符串解析为通用Enum值:

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

我想将其从辅助方法更改为扩展方法,但我对使用泛型并不十分熟悉,因此不确定是否/如何使用泛型。

我尝试过此方法,但是您很快就会看到此代码实际上并未编译:

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

我也尝试过这样做,但这也不起作用:

public static Enum ParseEnum(this Enum myEnum, string value)
{
    return Enum.Parse(typeof(myEnum), value, true);
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*iho 5

在编写扩展方法时,您需要做的第一件事就是弄清楚如何调用它。即什么是你延长?

在解析a string并返回一个enum值的情况下,真正有意义的唯一事情就是扩展string该类。在该视图中,扩展方法将如下所示:

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

您可以这样称呼它:

Pets pet = "Cat".ParseEnum<Pets>();
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用类型推断,但要以按引用参数为代价(我希望避免):

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

您会这​​样称呼:

Pets pet;

"Cat".ParseEnum(out pet);
Run Code Online (Sandbox Code Playgroud)

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

请注意,语法Pets.ParseEnum("Cat")是行不通的,因为Pets它是类型名称,而不是类型实例,并且只能基于对象的实例进行扩展。但是上面的示例也许足够接近(无论如何键入的字符数都差不多:))