2015-10-23 109 views
1

比方說,我有這樣的:解析值到可空枚舉

PriorityType? priority; 
string userInput = ...; 

我不能改變這個是怎麼定義的:PriorityType? priority,因爲它實際上是用另一段代碼合同的一部分。

我嘗試這樣做,但它不工作:

if (Enum.TryParse<PriorityType?>(userInput, out priority)) { 

什麼是正確的方法是什麼?

+3

你不能創建一個臨時的'PriorityType',然後在解析它之後將它分配給'priority'? –

+0

是的,我可以,只是認爲可能有更好的辦法。發佈這個答案,如果沒有更好的方法,那麼我會接受你的。 :) – core

+0

我不認爲有。 'TEnum'通用參數設置爲'where TEnum:struct'。 –

回答

1

最簡單的方法:

PriorityType tempPriority; 
PriorityType? priority; 

if (Enum.TryParse<PriorityType>(userInput, out tempPriority)) 
    priority = tempPriority; 

編輯

這是我能拿出最好的:

public static class NullableEnum 
{ 
    public static bool TryParse<T>(string value, out T? result) where T :struct, IConvertible 
    { 
     if (!typeof(T).IsEnum) 
      throw new Exception("This method is only for Enums"); 

     T tempResult = default(T); 

     if (Enum.TryParse<T>(value, out tempResult)) 
     { 
      result = tempResult; 
      return true; 
     } 

     result = null; 
     return false; 
    } 
} 

用途:

if (NullableEnum.TryParse<PriorityType>(userInput, out priority)) 

以上類可以像Enum.TryParse一樣使用,但可輸入爲空。您可以添加另一個重載函數,該函數使用非空值T,以便您可以在兩種情況下使用它。不幸的是,擴展方法在枚舉類型上不能很好地工作(只要我可以在短時間內嘗試操作它)。