繁体   English   中英

TryGet方法风格的最佳实践

[英]Best practice for TryGet method style

我有一个枚举方法,如下所示:

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概念的int.TryParse 我看到它的方式,在我的新方法中,我可以调用我的另一个,捕获异常(如果有的话)并相应地返回,或者我可以重构现有的返回bool并再次在我的新方法中简单地调用现有的如果返回false则抛出异常。

如果我选择选项2,我会丢失确切的异常详细信息,如果我选择选项1,则仍会抛出异常(我总是被教导异常很慢)。

我还可以重构现有的一个bool指示是否抛出异常,但这并不适合我。

对于这种方法风格或模式,我是否错过了一颗智慧之珠?

如果你已经有抛出的方法,那么很容易使用它来Try...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;
}

查看消息来源,您会发现miscrosoft确实使用了一种模式 它们具有内部方法,该方法使用经过验证的参数调用。 并且通过Try...和普通变体单独完成验证。 参见double.Parse()double.TryParse() ,第一个将在验证时throw而其他将返回false。

因此,如果您可以创建一个由两个变体调用的私有方法。 此方法不应验证任何内容(可能会引发异常)并在公共变体中调用此方法,这两种方法都验证参数( Try.. return false和其他throws)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM