我正在尝试将Expression<Func<Entity, bool>>
类型的表达式转换为Func<Entity, bool>
。
这里的背景是我试图模拟一个存储库,以便它返回一个给定键值的模拟实体集合之一。 (我可以将输入值硬编码到模拟方法,但这对于大量项目来说似乎是错误的方法。)
所以我试图像我这样在我的存储库上模拟第一个方法:
var collection = new List<Entity>
{
mockedEntity1,
mockedEntity2,
mockedEntity3,
...
};
mockRepository
.Setup(rep => rep.First(It.IsAny<Expression<Func<Entity, bool>>>()))
.Returns<Expression<Func<Entity, bool>>>(e => collection.First(e));
这不起作用,因为collection.First采用Func而不是Expression&gt;。所以我已经到了需要将Expression转换为它包含的Func的地步。
也许这样做更简单或更好?
答案 0 :(得分:4)
您需要在表达式上调用Compile
。
答案 1 :(得分:4)
已经 是一个lambda表达式。但要从lambda获取委托,请致电.Compile()
。
在通用意义上 - 要从Expression创建lambda,您将使用Expression.Lambda,指示所需类型并包括参数(声明)实例(来自Expression.Parameter)。但是,这里不需要这样做。