2011-06-14 51 views
3

我有一個關於解析字符串枚舉的奇怪問題。實際上,我的應用程序需要處理來自配置文件的少量枚舉的解析。但是,我不想爲每個枚舉類型編寫解析例程(因爲有很多)。c#中的通用枚舉字符串值分析器?

我面臨的問題是,下面的代碼顯示了一些奇怪的錯誤 - T的類型必須是一個不可爲空的值類型或類型的東西。我認爲枚舉默認是不可空的?

如果我使用where T : enum限制T的類型,則方法體內的所有其他內容(if Enum.TryParse語句除外)都會被強調爲錯誤。

任何人都可以幫助這個奇怪的小問題?

感謝, 馬丁

public static T GetConfigEnumValue<T>(NameValueCollection config, 
             string configKey, 
             T defaultValue) // where T : enum ? 
{ 
    if (config == null) 
    { 
     return defaultValue; 
    } 

    if (config[configKey] == null) 
    { 
     return defaultValue; 
    } 

    T result = defaultValue; 
    string configValue = config[configKey].Trim(); 

    if (string.IsNullOrEmpty(configValue)) 
    { 
     return defaultValue; 
    } 

    //Gives me an Error - T has to be a non nullable value type? 
    if(! Enum.TryParse<T>(configValue, out result)) 
    { 
     result = defaultValue; 
    } 

    //Gives me the same error: 
    //if(! Enum.TryParse<typeof(T)>(configValue, out result)) ... 

    return result; 
} 

要求張貼錯誤的文本的用戶(這是在代碼的時候,沒有編譯/運行時),所以這裏有雲:

的類型'T'必須是非空值類型,以便將其用作泛型類型或方法'System.Enum.TryParse(string,out TEnum)'中的參數TEnum'

+0

你能附上錯誤?沒有where條件,它看起來像你的代碼應該工作。 – 2011-06-14 17:17:07

+0

試試'where T:struct' – 2011-06-14 17:22:32

+0

@ jdv-Jan de Vaan這樣做的工作?我的意思是我知道枚舉是真正的整數和整數是類型System.Int32結構...但它真的工作? – bleepzter 2011-06-14 17:28:32

回答

1
public static T GetConfigEnumValue<T>(NameValueCollection config, string configKey, T defaultValue) 
{ 
    if (config == null) 
    { 
     return defaultValue; 
    } 

    if (config[configKey] == null) 
    { 
     return defaultValue; 
    } 

    T result = defaultValue; 
    string configValue = config[configKey].Trim(); 

    if (string.IsNullOrEmpty(configValue)) 
    { 
     return defaultValue; 
    } 

    try 
    { 
     result = (T)Enum.Parse(typeof(T), configValue, true); 
    } 
    catch 
    { 
     result = defaultValue; 
    } 

    return result; 
} 
0

由於C#不會讓你做where T : enum,所以你必須使用where T : struct

請注意,建議的解決方法有Michael

1

啊OK,在考慮這些信息,我看到什麼Enum.TryParse方法抱怨。

把通用約束的方法,像這樣:

public static T GetConfigEnumValue<T>(NameValueCollection config, 
             string configKey, 
             T defaultValue) // where T : ValueType 

或只是地方就是在Enum.TryParse方法相同的約束。

where T : struct, new() 

,你可以在這裏找到這樣的定義:

http://msdn.microsoft.com/en-us/library/dd783499.aspx

+0

請注意'where T:ValueType'不起作用,'ValueType'可爲空,它必須是'where T:struct'。 – 2014-09-10 18:29:33