我有一个带泛型参数的方法,它根据运行时字符串值过滤值。它要么通过值,要么返回默认值();
public T Filter<T>(string target, string actual, T value)
{
bool isMatch = !string.IsNullOrEmpty(target)
&& !string.IsNullOrEmpty(actual)
&& target.ToUpper() == actual.ToUpper();
return isMatch ? value : default(T);
}
除了布尔值以外,大多数情况都适用。当一个布尔值为false并且应该被过滤时,它将返回为false - 默认值()为布尔值。
所以当传入bool
时我希望这样做是为了返回布尔值的倒数。如何从T
转到bool
并返回到返回类型T
?
谢谢!
答案 0 :(得分:2)
编辑:我会使用默认参数的dtb答案。但是,如果您因任何原因无法使用它,这是我的替代方案。
我会将匹配的代码重构为新方法,并使用特定版本的布尔值重载泛型。
public T Filter<T>(string target, string actual, T value)
{
return _match(target, actual) ? value : default(T);
}
public bool Filter(string target, string actual, bool value)
{
return _match(target, actual) ? value : !value;
}
private bool _match(string target, string actual)
{
return !string.IsNullOrEmpty(target)
&& !string.IsNullOrEmpty(actual)
&& string.Equals(target, actual, StringComparison.CurrentCultureIgnoreCase);
}
当第3个参数是布尔值时,方法调用将解析为布尔版本。如果不是,它将解析为通用版本。
答案 1 :(得分:2)
使用bool?
作为通用类型,可以简化这一过程。如果不匹配,default(bool?)
将为null
,这与true
或false
完全不同。这也适用于其他基元和值类型,它们将返回null
而不是完全有效的0
。
答案 2 :(得分:2)
您是否考虑过将默认值传递给方法?
public T Filter<T>(string target, string actual, T value, T defaultValue = default(T))
{
bool isMatch = !string.IsNullOrEmpty(target)
&& !string.IsNullOrEmpty(actual)
&& string.Equals(target, actual, StringComparison.CurrentCultureIgnoreCase)
return isMatch ? value : defaultValue;
}
用法:的
Filter("foo", "bar", 42); // returns 0
Filter("foo", "bar", false, true); // returns true