是否可以编写如下代码。我正在尝试将Moq与作为测试框架一部分反映的对象一起使用。下面的代码从Moq引发了一个“未处理的表达式类型:'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+";
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
好的,这是可能的,这是正确的代码。
// 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+";
Run Code Online (Sandbox Code Playgroud)
我通过使用以下代码从lambda创建表达式来调查了此问题
Expression<Func<IFoo, string>> setupBar = v => c.Bar;
Run Code Online (Sandbox Code Playgroud)
然后,我在vs 2010的调试器中进行了研究。表达式具有“调试视图”,该视图显示表达式的文本表示形式,因此可以在该表达式或类似内容上添加监视。以上作为
.Lambda #Lambda1<System.Func`2[WindowsFormsApplication1.IFoo,System.String]>(WindowsFormsApplication1.IFoo
$v) {
$v.Bar
}
Run Code Online (Sandbox Code Playgroud)
我查看了一下,试图找出什么表达式可以实现,然后创建了一个表达式并在调试器中对其进行了比较。
对我来说有趣的是,尽管此表达式返回一个值,但没有赋值或return语句。我想这一定是隐性的。
| 归档时间: |
|
| 查看次数: |
2199 次 |
| 最近记录: |