如何将表达式转换为lambda表达式?

时间:2011-07-17 11:31:15

标签: c# moq

我正在尝试将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的地步。

也许这样做更简单或更好?

2 个答案:

答案 0 :(得分:4)

您需要在表达式上调用Compile

答案 1 :(得分:4)

已经 是一个lambda表达式。但要从lambda获取委托,请致电.Compile()

通用意义上 - 要从Expression创建lambda,您将使用Expression.Lambda,指示所需类型并包括参数(声明)实例(来自Expression.Parameter)。但是,这里不需要这样做。