2016-05-31 360 views
0

我有一個方法枚舉,看起來像這樣:最佳實踐

public static TEnum GetEnumByStringValue<TEnum>(string value) where TEnum : struct, IConvertible, IComparable, IFormattable 
{ 
    if(!typeof(TEnum).IsEnum) 
    { 
    throw new ArgumentException("TEnum must be an enumerated type."); 
    } 

    Type type = typeof(TEnum); 
    FieldInfo[] fieldInfos = type.GetFields(); 
    foreach (FieldInfo fieldInfo in fieldInfos) 
    { 
    StringValue[] stringValues = fieldInfo.GetCustomAttributes(typeof(StringValue), false) as StringValue[]; 
    if (stringValues != null) 
    { 
     foreach (StringValue stringValue in stringValues) 
     { 
     if (stringValue.Value.Equals(value)) 
     { 
      return (TEnum)Enum.Parse(typeof(TEnum), fieldInfo.Name); 
     } 
     } 
    } 

    } 
    throw new ArgumentOutOfRangeException("value", "Value was not found in enum's string values."); 
} 

我想實現一個TryGetEnumByStringValue,返回true或false,而不是拋出一個異常的類似概念int.Parseint.TryParse。我看到它的方式,在我的新方法中,我可以調用另一個方法,捕獲異常(如果有)並相應返回,或者我可以重構現有方法以返回bool,並再次用我的新方法調用現有方法並在返回false時拋出異常。

如果我使用選項2去我失去了確切異常的詳細信息,如果我有選擇1去例外仍然拋出(我一直被教導的例外是慢)。

我也可以重構現有采取bool指示是否拋出異常與否,但是,這並不完全正確和我一起坐。

有我錯過了這種方法,風格或樣式的智慧珍珠?

+0

我只是簡單地使用你已有的方法,不需要複製整個邏輯,只需重新使用它 – Fabjan

+0

請檢查以下鏈接作爲示例:[link](http://stackoverflow.com/questions/15294878/how-the-int-tryparse-actually-works)'int'也會重用它。 –

+0

你想傳遞一個布爾值來表明它是否應該拋出可以應用到一個私有方法,然後你的公共方法會用適當的布爾值來調用它。 – juharr

回答

0

如果你已經有一個拋出的方法,那麼它很容易的就Try...變種利用,使...驚喜! try/catch

public bool TryReturnSomething(..., out SomeType result) // ... - parameters 
{ 
    try 
    { 
     result = ReturnSomething(); 
     return true; 
    } 
    catch(SomeException1 e) { } // catch all expected exception types 
    catch(SomeException2 e) { } 

    return false; 
} 

展望sources你會發現,miscrosoft確實使用一種模式的。他們有內部的方法,這被稱爲驗證參數。並且驗證由Try...和正常變體單獨完成。見例如double.Parse()double.TryParse(),第一個在驗證時將throw和其他返回false。

所以,如果你可以創建你通過這兩個變種調用一個私有方法。此方法不應驗證任何內容(可能會引發異常)並在公共變體中調用此方法,這兩種方法都會驗證參數(Try..返回false和其他throws)。