[英]Is it possible to write an extension method for a generic Enum type?
在这个StackOverflow问题上 ,我发现了一个非常好的帮助程序方法,用于将字符串解析为通用Enum值:
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);
}
甚至可以做我在这里问的事情吗?
编写扩展方法时,您需要做的第一件事就是弄清楚如何调用它。 即你在扩大?
在解析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
是类型名称,而不是类型实例,并且只能基于对象实例进行扩展。 但是上面的示例也许足够接近(无论如何键入的字符数都差不多:))
您可以将您的辅助方法重命名为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");
这不是扩展方法。 但是,它具有扩展方法的目标之一。 将类命名为接近Enum会尝试帮助发现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.