我有一個方法枚舉,看起來像這樣:最佳實踐
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.Parse
和int.TryParse
。我看到它的方式,在我的新方法中,我可以調用另一個方法,捕獲異常(如果有)並相應返回,或者我可以重構現有方法以返回bool
,並再次用我的新方法調用現有方法並在返回false時拋出異常。
如果我使用選項2去我失去了確切異常的詳細信息,如果我有選擇1去例外仍然拋出(我一直被教導的例外是慢)。
我也可以重構現有采取bool
指示是否拋出異常與否,但是,這並不完全正確和我一起坐。
有我錯過了這種方法,風格或樣式的智慧珍珠?
我只是簡單地使用你已有的方法,不需要複製整個邏輯,只需重新使用它 – Fabjan
請檢查以下鏈接作爲示例:[link](http://stackoverflow.com/questions/15294878/how-the-int-tryparse-actually-works)'int'也會重用它。 –
你想傳遞一個布爾值來表明它是否應該拋出可以應用到一個私有方法,然後你的公共方法會用適當的布爾值來調用它。 – juharr