Хорошо, это возможно, вот исправленный код.
// 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+";
Я исследовал это, создав выражение из лямбды, используя код ниже
Expression<Func<IFoo, string>> setupBar = v => c.Bar;
Затем я посмотрелэто в отладчике vs 2010. У выражений есть «представление отладки», которое показывает текстовое представление выражения, так что можно добавить часы на это или что-то подобное.Вышеприведенное выглядит как
.Lambda #Lambda1<System.Func`2[WindowsFormsApplication1.IFoo,System.String]>(WindowsFormsApplication1.IFoo
$v) {
$v.Bar
}
Я посмотрел на это и попытался выяснить, что Expressions сделает это, затем создал выражение и сравнил его в отладчике.
Интересная вещь дляЯ в том, что хотя это выражение возвращает значение, нет оператора присваивания или возврата.Я думаю, это должно быть как-то неявно.