2009-06-30 48 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); 
    } 
}