在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);
}
甚至可以在这里做我要问的事情吗?
答案 0 :(得分:5)
在编写扩展方法时,您需要做的第一件事就是弄清楚如何调用它。即你在扩展什么?
在解析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
是类型名称,而不是类型实例,并且您只能基于实例扩展对象。但也许上面的例子足够接近(无论如何都要输入相同数量的字符:))
答案 1 :(得分:0)
您可以将辅助方法重命名为Enum&lt;&gt;使它看起来像是在扩展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的类会尝试帮助发现。