gpt4 book ai didi

c# - Lambda 表达式参数

转载 作者:行者123 更新时间:2023-11-30 16:59:38 28 4
gpt4 key购买 nike

我正在尝试为 Moq 创建一个扩展方法,我可以在其中发送要在异步返回函数中使用的表达式。然而,这个问题并不是真正的最小起订量。这是我到目前为止所拥有的:

public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult, T>(this IReturns<TMock, Task<TResult>> setup, Func<T, TResult> valueFunc) where TMock : class
{
return setup.Returns(Task.FromResult(valueFunc.Invoke(default(T))));
}

这就是我希望使用它的方式。

repo.Setup(x => x.FindAsync(It.IsAny<Expression<Func<T, bool>>>())).ReturnsAsync((Expression<Func<T, bool>> e) => context.GetSet<T>().FirstOrDefault(e));

现在我真的不知道这一切是如何工作的,我想不通的是如何将表达式传递给 ReturnsAsync 函数,这样我就可以将它用作参数而不是默认值 ( T) 我把它放在那里作为占位符。

正如预期的那样,此处的“e”变量变为空。

最佳答案

这个方法会做你想做的事:

public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult, T>(
this IReturns<TMock, Task<TResult>> setup,
Func<Expression<Func<TResult, T>>, TResult> valueFunc)
where TMock : class
{
return setup.Returns<Expression<Func<TResult, T>>>(
e => Task.FromResult(valueFunc(e)));
}

然后像这样使用它:

repo.Setup(x => x.FindAsync(It.IsAny<Expression<Func<T, bool>>>()))
.ReturnsAsync<IRepository, int, bool>(e => context.GetSet<T>().FirstOrDefault(e));

本质上,这个版本的ReturnsAsync接受一个需要谓词函数的函数(即 e )并返回 T .这允许您随后针对您的测试数据集 (context.GetSet<T>.FirstOrDefault) 执行谓词。另外,我使用了 Returns 的重载接受类型参数;这用于转发来自 Setup 的参数调用指定为 Returns 的函数争论。

您的版本签名仅指定了谓词,因此您无法针对测试数据执行它。你也有 TTResultvalueFunc 中向后键入参数参数类型。

关于c# - Lambda 表达式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23548400/

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