ExtensionMethod ThrowIf Invert Func <t,bool>

时间:2016-03-27 12:18:07

标签: c# extension-methods func

我编写了一个扩展方法,如果布尔函数对给定类型T的计算结果为true / false,则抛出异常。

    public static void ThrowIf<T>(this T source, Func<T,bool> func, string name, bool invert = false)
    {
        if (func.Invoke(source) != invert)
            throw new ArgumentException(func.Method.Name + " check failed, inverted:" + invert, name);
    }

我正按照以下方式使用

name.ThrowIf(String.IsNullOrEmpty, "name");
path.ThrowIf(File.Exists, "path", true);

是否有更简洁的解决方案来包含反转功能​​,而不是在我的ThrowIf中传递标记或创建ThrowIfNot?

1 个答案:

答案 0 :(得分:3)

我相信另一种方法显然会更有意义(正如你在问题中已经说过的那样...... ):

name.ThrowIf(String.IsNullOrEmpty, "name");
path.ThrowIfNot(File.Exists, "path");

...您可以使用反转ThrowIf / true参数私有来制作false

private static void ThrowIf<T>(this T source, Func<T,bool> func, string name, bool invert)
{
    if (func.Invoke(source) != invert)
        throw new ArgumentException(func.Method.Name + " check failed, inverted:" + invert, name);
}

public static void ThrowIf<T>(this T source, Func<T, bool> func, string name) 
       => ThrowIf<T>(source, func, name, false);
public static void ThrowIfNot<T>(this T source, Func<T, bool> func, string name) 
       => ThrowIf<T>(source, func, name, true);
顺便说一下,如果您正在寻找实施参数验证,那么重构一切以使用code contracts可能会更好:

public void SomeMethod(string someParameter)
{
    Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(someParameter));
}