gpt4 book ai didi

c# - TryGet 方法风格的最佳实践

转载 作者:行者123 更新时间:2023-12-04 16:47:33 41 4
gpt4 key购买 nike

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

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指示是否抛出异常,但这不太适合我。

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

最佳答案

如果你已经有了 throws 的方法,那么很容易制作 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你会发现微软确实在使用某种模式。它们具有使用验证参数调用的内部方法。验证由 Try... 单独完成和正常的变体。见例如 double.Parse()double.TryParse() , 第一个会 throw当验证和其他返回false。

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

关于c# - TryGet 方法风格的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546622/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com