Moq和reflection,将动态生成的表达式树/ lambda传递给moq

是否可以编写如下代码。 我正在尝试将Moq与我正在反思的对象一起用作测试框架的一部分。 下面的代码从Moq引出了一个“Unhandled expression type:’Goto’”exception,我猜这个exception会有所不同。 它看起来应该工作了!

private void button1_Click(object sender, EventArgs e) { Ifoo = foo Foo(); // Create input parameter for lambda ParameterExpression value = Expression.Parameter(typeof(IFoo), "value"); // create return statement for lambda Expression setupProperty = Expression.Return(Expression.Label(), Expression.Property(value, "Bar"), typeof(string)); // convert expression to lambda (should now be the equivalent of "v => v.Bar") var func = Expression.Lambda<Func>(setupProperty, value);//.Compile(); //string s = func(foo); // this bit works fine in .Compile() is included var mockFoo = new Mock(); mockFoo.SetupProperty(func); // exception thrown by moq here, obviously isn't exactly the same as "v => v.Bar" mockFoo.Object.Bar = "Burge+"; } 

谢谢!

好的,这是可能的,这是更正后的代码。

 // Create input parameter for lambda ParameterExpression value = Expression.Parameter(typeof(IFoo), "value"); // create return statement for lambda Expression setupProperty = Expression.Property(value, "Bar"); // convert expression to lambda (should now be the equivalent of "v => v.Bar") var func = Expression.Lambda>(setupProperty, value); var mockFoo = new Mock(); mockFoo.SetupProperty(func); // this works now mockFoo.Object.Bar = "Burge+"; 

我通过使用下面的代码从lambda创建表达式来调查这一点

 Expression> setupBar = v => c.Bar; 

然后我在vs 2010的调试器中查看了这个。表达式有一个“调试视图”,它显示了表达式的文本表示,因此可以在该类或类似的东西上添加监视。 以上是出自

  .Lambda #Lambda1(WindowsFormsApplication1.IFoo $v) { $v.Bar } 

我查看了这个并试图弄清楚表达式会做什么,然后创建一个表达式并在调试器中进行比较。

对我来说有趣的是,虽然这个表达式返回一个值,但是没有赋值或返回语句。 我猜这必须以某种方式暗示。