反转布尔的通用方法

时间:2013-09-05 23:58:37

标签: c# generics

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

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

谢谢!

3 个答案:

答案 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,这与truefalse完全不同。这也适用于其他基元和值类型,它们将返回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