此代码:
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") );
我如何确定如何像上面一样编写表达式? 有没有办法"调试"表达式树,以便我可以手动编程?
编辑:
我在这里看到了有希望的答案,但它最终没有找到工作代码。 这是他们的版本(错误是 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);
让编译器完成工作。
如果你代替
func<string,bool> MyLambda = p => p.name.Contains("chair");
写
Expression<func<string,bool>> MyExpression = p => p.name.Contains("chair");
然后你会得到一个很好的"MyExpression",你可以在调试器中检查它。