扩展方法 ThrowIf Invert Func<T,bool>
ExtensionMethod ThrowIf Invert Func<T,bool>
我编写了一个扩展方法,如果布尔函数对给定类型 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 更简洁的解决方案来包含反转功能?
我相信显然另一种方法会更有意义(正如您在问题中已经说过的...):
name.ThrowIf(String.IsNullOrEmpty, "name");
path.ThrowIfNot(File.Exists, "path");
...您可以使用反转 true
/false
参数 private:
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));
}
我编写了一个扩展方法,如果布尔函数对给定类型 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 更简洁的解决方案来包含反转功能?
我相信显然另一种方法会更有意义(正如您在问题中已经说过的...):
name.ThrowIf(String.IsNullOrEmpty, "name");
path.ThrowIfNot(File.Exists, "path");
...您可以使用反转 true
/false
参数 private:
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));
}