2011-05-16 47 views
1

此代码:Lambda表达式:如何分析代表如何作为表达式存储?

var lambda = Products.Where(p => p.name == "chair"); 

可以这样写代码:

var propertyName = "name"; 
var value = "chair"; 
var arg = Expression.Parameter(typeof(Product), "p"); 
var property = typeof(Product).GetProperty(propertyName); 
var comparison = Expression.Equal(
    Expression.MakeMemberAccess(arg, property), 
    Expression.Constant(value)); 
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile(); 

如果我有任何Lambda表达式是这样的:

Products.Where(p => p.name.Contains("chair")); 

我怎么能确定如何写像上面的表达?有没有办法“调试”表达式树,以便我可以手动编程?

编辑:

我看到有前途的答案here但它并没有与工作代码结束。这里是他们的版本(错误是StartsWith方法给出一个非字符串值):

ParameterExpression p = Expression.Parameter(typeof(Product), "p"); 
MethodInfo method = typeof(string).GetMethod("StartsWith", 
    new[] { typeof(string) }); 
var containsMethodExp = Expression.Call(p, method, 
    Expression.Constant("root"), p); 
+1

也许这样? http://xte.codeplex.com/ – mellamokb 2011-05-16 05:06:22

+0

@mellamokb:bool(string x)=> x.Contains(“chair”)在该软件中产生了异常错误。非常好的建议,但。 – 2011-05-16 05:18:27

回答

2

只要让编译器执行工作。

如果代替

func<string,bool> MyLambda = p => p.name.Contains("chair"); 

Expression<func<string,bool>> MyExpression = p => p.name.Contains("chair"); 

然后你得到一个不错的 “MyExpression”,你可以在调试器检查。