我有一个方法枚举,看起来像这样:最佳实践
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