此代码:
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);
答案 0 :(得分:2)
让编译器完成工作。
如果你不是
func<string,bool> MyLambda = p => p.name.Contains("chair");
写
Expression<func<string,bool>> MyExpression = p => p.name.Contains("chair");
然后你得到一个很好的“MyExpression”,你可以在调试器中检查。