1

我有一个带有通用参数的方法,它根据运行时字符串值过滤值。它要么让值通过,要么返回 default();

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);

    }

这适用于除布尔值以外的大多数情况。当 boolean false 进入并应该被过滤时,它会返回为 false —— boolean 的 default()。

因此,当传入 a 时,我希望这样做bool是返回布尔值的倒数。如何往返T返回bool类型T

谢谢!

4

3 回答 3

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);
    }

当第三个参数为布尔值时,方法调用将解析为布尔值。如果不是,它将解析为通用版本。

于 2013-09-06T00:14:21.790 回答
2

您可以通过将bool?其用作泛型类型来简化此操作。当没有匹配时,default(bool?)will be ,这与ornull非常有区别。这也适用于其他原始类型和值类型,它们将返回而不是完全有效的.truefalsenull0

于 2013-09-06T00:57:56.143 回答
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
于 2013-09-06T01:08:17.097 回答