c# - 是否可以为泛型 Enum 类型编写扩展方法?

标签 c# generics enums

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

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

我想将其从辅助方法更改为扩展方法,但我不太熟悉使用泛型,所以我不确定这是否/如何工作。

我尝试过这个,但是您很快就会看到这段代码实际上并没有编译:

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 类。从这个角度来看,扩展方法如下所示:

    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 是类型名称,而不是类型实例,您可以仅基于对象的实例进行扩展。但也许上面的例子已经足够接近了(无论如何,输入的字符数大约相同:))

关于c# - 是否可以为泛型 Enum 类型编写扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28488994/

相关文章:

c# - 如何从 swagger.json 中删除反引号

c# - 如何让 WPF ContextMenu 在打开时自动选择第一个项目?

java - 通用工厂方法和 Class<T> 参数

java - 复制枚举数组

c# - 如何构建表达式以从基类调用相等运算符?

c# - 必须放在带有 runat=server 的表单标签内

c# - 反射、泛型、事件处理程序和委托(delegate)问题

java - 由于边界原因,maven 拒绝编译泛型类,即使在转换类之后也是如此

java - 零实例枚举与防止实例化的私有(private)构造函数

ios - 从枚举设置 UISegmentedControl 的标题(内置 IB,不是代码)