是否可以为通用枚举类型编写扩展方法?
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 试图帮助发现。
在 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 试图帮助发现。