2009-06-30 81 views
22

我想有间从一个字符串在C#中的枚举显式类型转换,才能有这样的:C#显式类型转换字符串枚举

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue) 

我想驱逐到一个明确的转换操作此,我这样做,但没有工作:

public static explicit operator (MyEnum)(value stringValue){ 
    return (MyEnum) Enum.Parse(typeof(MyEnum),stringValue); 
} 

你知道是否有可能在C#中使用.NET 3.5吗?

回答

29

无法投射。问题是用户定义的转换必须包含在结构或类声明中,并且转换必须是或来自于封闭类型。因此,

public static explicit operator MyEnum(string value) 

是不可能的,因为既不MyEnum也不string可以永远是封闭类型。

在ECMA334 C#规范的相关部分是17.9.4:

A转换算子从源类型,由参数类型转换 操作者的指示,到目标类型,由返回指示转换转换运算符的类型。只有在以下所有条件都成立的情况下,才允许声明从源类型S到目标类型T的转换的类或结构为 ,其中S0和T0是删除尾随类型所产生的类型。如果有的话,来自S和T的修饰符:

S0和T0是不同的类型。

S0或T0是运算符声明发生的类或结构类型

S0和T0都不是接口类型。

剔除用户定义的转换,转换不存在从S到T或从T到S.

然而,可以执行对字符串类的扩展方法。

public static class StringExtensions { 
    public static T ConvertToEnum<T>(this string value) { 
     Contract.Requires(typeof(T).IsEnum); 
     Contract.Requires(value != null); 
     Contract.Requires(Enum.IsDefined(typeof(T), value)); 
     return (T)Enum.Parse(typeof(T), value); 
    } 
} 
+0

很好的回答!我知道我曾经在某处看过它,但不记得如何解决这个问题。谢谢! – 2012-01-27 20:34:01

9

是否需要使用投射算子?另一种选择是在字符串之外添加扩展方法:

public static class StringEnumConversion 
{ 
    public static T Convert<T>(this string str) 
    { 
     return (T)Enum.Parse(typeof(T), str); 
    } 
}