2014-09-30 128 views
1

我有类创建一个表达式树手动

public class MyModel 
{ 
    public MyModel() 
    { 
     this.Map = new MyMap(); 
    } 
    public MyMap Map { get; set; } 
} 

public class MyMap 
{ 
    public string MyProperty1 { get; set; } 
    public int MyProperty2 { get; set; } 
} 

我如何构建这个拉姆达

Expression<Func<MyModel, string>> exp = m => m.Map.MyProperty1; 

使用表达式树手动?

+2

检查'exp'的价值在调试器中研究'Expression'中的静态方法,这将允许您构建该树。 – 2014-09-30 23:13:11

+0

我会尽力的,谢谢! – user3900456 2014-09-30 23:14:32

+0

您可以添加一些关于如何使用exp的内容,这将帮助我为您提供一个更好的示例。 – Phaeze 2014-10-01 00:19:43

回答

0

你可以做到这一点使用表达式的PropertyOrField方法,这里是一个简单的例子我熟了使用对象:

var model = new MyModel(); 

var mapExpr = Expression.PropertyOrField(Expression.Constant(model), "Map"); 
var propExpr = Expression.PropertyOrField(mapExpr, "MyProperty1"); 

Expression.Lambda<Func<string>>(propExpr).Compile()(); //Outputs the value of MyProperty1 on the variable called model. 
+0

谢谢,但没有另外一种不需要它拥有对象实例的方法吗? – user3900456 2014-09-30 23:39:42

+0

您需要尝试找到一种方法来传递适用于您的实例,但在某些情况下需要该实例。我会发布另一个例子,与您的用例无关,但希望这会让您更好地了解如何构建这个结构。 – Phaeze 2014-10-01 00:04:03

+0

@ user3900456我已经决定我的例子不会像我那样提供尽可能多的价值,但我留下了对这个问题的评论,要求提供更多的细节,一旦你发布了我会试图想出一个符合你的用例的例子。 – Phaeze 2014-10-01 00:34:27

3

像这样:

var parameter = Expression.Parameter(typeof (MyModel)); 
var mapProperty = Expression.Property(parameter, "Map"); 
var myProperty1 = Expression.Property(mapProperty, "MyProperty1"); 

var exp = Expression.Lambda<Func<MyModel, string>>(myProperty1, parameter);