C# Moq和反射,将动态生成的表达式树/lambda传递给Moq

C# Moq和反射,将动态生成的表达式树/lambda传递给Moq,c#,reflection,moq,C#,Reflection,Moq,是否可以编写如下代码。我正在尝试将Moq用于作为测试框架一部分的对象。下面的代码从Moq中引发了一个“Unhandled expression type:'Goto'”异常,我想这应该是不同的结果。不过看起来应该能用 private void button1_Click(object sender, EventArgs e) { Ifoo = foo Foo(); // Create input parameter for lambda

是否可以编写如下代码。我正在尝试将Moq用于作为测试框架一部分的对象。下面的代码从Moq中引发了一个“Unhandled expression type:'Goto'”异常,我想这应该是不同的结果。不过看起来应该能用

    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<IFoo, string>>(setupProperty, value);//.Compile();
        //string s = func(foo); // this bit works fine in .Compile() is included

        var mockFoo = new Mock<IFoo>();

        mockFoo.SetupProperty(func); // exception thrown by moq here, obviously isn't exactly the same as "v => v.Bar"
        mockFoo.Object.Bar = "Burge+";
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
Ifoo=foo-foo();
//为lambda创建输入参数
ParameterExpression值=表达式参数(typeof(IFoo),“value”);
//为lambda创建返回语句
Expression setupProperty=Expression.Return(Expression.Label()、Expression.Property(value,“Bar”)、typeof(string));
//将表达式转换为lambda(现在应该相当于“v=>v.Bar”)
var func=Expression.Lambda(setupProperty,value);//.Compile();
//字符串s=func(foo);//此位在中工作正常。包括Compile()
var mockFoo=new Mock();
mockFoo.SetupProperty(func);//这里moq抛出的异常显然与“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<Func<IFoo, string>>(setupProperty, value);

var mockFoo = new Mock<IFoo>(); 
mockFoo.SetupProperty(func); // this works now
mockFoo.Object.Bar = "Burge+"; 
//为lambda创建输入参数
ParameterExpression值=表达式参数(typeof(IFoo),“value”);
//为lambda创建返回语句
表达式setupProperty=Expression.Property(值为“Bar”);
//将表达式转换为lambda(现在应该相当于“v=>v.Bar”)
var func=Expression.Lambda(setupProperty,value);
var mockFoo=new Mock();
mockFoo.SetupProperty(func);//现在可以了
mockFoo.Object.Bar=“Burge+”;
我通过使用下面的代码从lambda创建一个表达式来研究这个问题

Expression<Func<IFoo, string>> setupBar = v => c.Bar;
expressionsetupbar=v=>c.Bar;
然后,我在VS2010的调试器中查看了这一点。表达式有一个“调试视图”,显示表达式的文本表示形式,因此可以在该视图上添加手表或类似的内容。以上是一个例子

 .Lambda #Lambda1<System.Func`2[WindowsFormsApplication1.IFoo,System.String]>(WindowsFormsApplication1.IFoo
 $v) {
   $v.Bar
 }
.Lambda#Lambda1(WindowsFormsApplication1.IFoo
$v){
$v.Bar
}
我看了一下这个,试图找出什么表达式会产生这个结果,然后创建了一个表达式,并在调试器中进行了比较

对我来说有趣的是,尽管这个表达式返回一个值,但没有赋值或返回语句。我想这一定是含蓄的