组合函数将使应用程序崩溃,而不会出现任何错误。即使周围使用try-catch也无济于事。
详细信息
在应用程序中,我能够为正在处理的数据指定过滤器。当我只有一个筛选器时,它工作得很好,但是当有多个筛选器和||操作符组合在一起时,应用程序(asp.net核心3.1)就会停止调试,不会抛出任何异常。
示例测试不会通过,不会失败,而只是崩溃,没有任何异常:
[Fact]
public void ShouldFilterWithFilterGroup()
{
// Arrange
var filters = new List<Func<object, bool>>();
filters.Add(x => true);
filters.Add(x => true);
Func<object, bool> filterFunction = null;
foreach (var item in filters)
{
if (filterFunction == null)
{
filterFunction = x => item(x);
}
else
{
filterFunction = x => filterFunction(x) || item(x);
}
}
// Act
var filterResult = filterFunction(null); // Test just stops here without throwing any exception
// Assert
Assert.True(filterResult);
}发布于 2020-10-08 22:34:01
是的,你有一个递归。不要手动操作,已经有一种方法可以用“or”来检查所有这些参数:
var result = filters.Any(filter => filter(input));如果你确实需要一个单独的函数来传递,你也可以这样做:
Func<object, bool> filterGroup = (input) => filters.Any(filter => filter(input));发布于 2020-10-08 22:26:00
我的猜测是你有一个无限循环。filterFunction将在没有任何退出条件的情况下调用自身。这最终会导致堆栈溢出异常。
要修复它,请尝试将filterfunction赋给一个局部变量:
var localFunction = filterFunction;
filterFunction = x => localFunction(x) || item(x);https://stackoverflow.com/questions/64264503
复制相似问题