2016-05-31 238 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)。