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") );

我如何确定如何像上面一样编写表达式? 有没有办法"调试"表达式树,以便我可以手动编程?

编辑:

我在这里看到了有希望的答案,但它最终没有找到工作代码。 这是他们的版本(错误是 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",你可以在调试器中检查它。

相关内容

  • 没有找到相关文章

最新更新