gpt4 book ai didi

c# - 如何将 Predicate 转换为 Expression> 以与 Moq 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 21:36:38 28 4
gpt4 key购买 nike

请帮助这个 Linq 新手!

我正在我的测试类中创建一个列表,我想使用 Moq 来检查结果。

我可以很容易地组合一个谓词来检查列表的结果。然后如何将该谓词变成表达式?

var myList = new List<int> {1, 2, 3};

Predicate<List<int>> myPredicate = (list) =>
{
return list.Count == 3; // amongst other stuff
};

// ... do my stuff

myMock.Verify(m => m.DidStuffWith(It.Is<List<int>>( ??? )));

???需要是 Expression<Predicate<List<int>>>如果你能理解那么多泛型。我找到了相反的答案,并将表达式编译成谓词。不过,它们并没有帮助我更好地理解 Linq。

编辑:我已经使用了方法;有表情;我只想知道是否有任何方法可以用带有主体的 lambda 来实现 - 如果没有,为什么不呢?

最佳答案

改变:

Predicate<List<int>> myPredicate = (list) => list.Count == 3;

收件人:

Expression<Predicate<List<int>>> myPredicate = (list) => list.Count == 3;

编译器为您施展魔法。有一些注意事项1,任何仅处理表达式(无 block )的 lambda 都可以通过包装委托(delegate)类型(在本例中为 Predicate<List<int>> )转换为表达式树Expression<> .如您所述,您可以通过调用 myPredicate.Compile() 再次反转它.

1 例如,异步 lambda(即 async () => await Task.Delay(1);)无法转换为表达式树。

更新:如果它包含语句,您只是不能使用编译器来获得您想要的表达式树。您必须使用 Expression 中的静态方法自己构建表达式树(需要更多工作) . ( Expression.BlockExpression.IfThen 等)

关于c# - 如何将 Predicate<T> 转换为 Expression<Predicate<T>> 以与 Moq 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com