C# Lambda表达式参数

C# Lambda表达式参数,c#,lambda,task-parallel-library,moq,func,C#,Lambda,Task Parallel Library,Moq,Func,我正在尝试为Moq创建一个扩展方法,在该方法中,我可以发送一个表达式以在异步返回函数中使用。然而,这个问题并不是特别针对最低起订量的。以下是我目前掌握的情况: public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult, T>(this IReturns<TMock, Task<TResult>> setup, Func<T, TResult> valueFunc) w

我正在尝试为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))));
}
公共静态IReturnsResult返回同步(此IReturns设置,Func valueFunc),其中TMock:class
{
return setup.Returns(Task.FromResult(valueFunc.Invoke)(默认值(T)));
}
这就是我希望使用它的方式

repo.Setup(x => x.FindAsync(It.IsAny<Expression<Func<T, bool>>>())).ReturnsAsync((Expression<Func<T, bool>> e) => context.GetSet<T>().FirstOrDefault(e));
repo.Setup(x=>x.FindAsync(It.IsAny()).ReturnsAsync((表达式e)=>context.GetSet().FirstOrDefault(e));
现在我真的不知道所有这些是如何工作的,我不知道的是如何将表达式传递到ReturnsAsync函数中,这样我就可以使用它作为参数,而不是作为占位符的默认值(t)


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

此方法将执行您想要的操作:

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)));
}
公共静态IReturnsResult返回同步(
这是一个设置,
Func valueFunc)
where-TMock:class
{
返回设置。返回(
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));
repo.Setup(x=>x.FindAsync(It.IsAny()))
.ReturnsAsync(e=>context.GetSet().FirstOrDefault(e));
本质上,这个版本的
ReturnsAsync
接受一个需要谓词函数(即
e
)的函数,并返回一个
T
。这允许您针对测试数据集(
context.GetSet.FirstOrDefault
)执行谓词。此外,我还使用了
Returns
的重载来接受类型参数;这用于将
设置
调用中的参数转发给指定为
返回
参数的函数


您的版本的签名只指定了谓词,因此您无法对测试数据执行它。在
valueFunc
参数的类型中,您还向后使用了
T
TResult
类型参数。

如果不是
async
,您将如何对其进行编码?这将是一个很好的起点。异步部分也不是真正相关的,只是在Moq中有一个类似于这样的函数,叫做Returns(但不适用于异步),它实现了我想要的功能,但我不知道具体如何实现。我自己可能会做的是将表达式作为它自己的参数发送,但我想知道如何使它工作,因为它看起来更好。在您希望使用它的地方,
返回
调用应该是
返回同步
,对吗?是的,对不起,在第二个代码块中,它应该是返回同步。将编辑。