Expression.Call 在简单的 lambda 表达式中。可能吗?

Posted

技术标签:

【中文标题】Expression.Call 在简单的 lambda 表达式中。可能吗?【英文标题】:Expression.Call in simple lambda expression. Is it possible? 【发布时间】:2012-01-09 10:18:23 【问题描述】:

我需要生成一个类似的 lambda 表达式

item => item.Id > 5 && item.Name.StartsWith("Dish")

好的,item.Id > 5 很简单

var item = Expression.Parameter(typeof(Item), "item");

var propId = Expression.Property(item,"Id");
var valueId = Expression.Constant(5);
var idMoreThanFive = Expression.GreaterThan(propId, valueId);

但是第二部分对我来说更复杂......

var propName = Expression.Property(item,"Name");
var valueName = Expression.Constant("Dish");

如何为 propName 调用 StartsWith?

【问题讨论】:

【参考方案1】:

您必须获得一个代表string.StartsWith(string) 方法的MethodInfo,然后使用Expression.Call 构造代表实例方法调用的表达式:

var property = Expression.Property(item, "Name");
var method = typeof(string).GetMethod("StartsWith", new[]  typeof(string) );
var argument = Expression.Constant("Dish");

// item.Name.StartsWith("Dish")
var startsWithDishExpr = Expression.Call(property, method, argument);

然后您必须将子表达式&& 一起创建主体。

var lambdaBody = Expression.AndAlso(idMoreThanFive, startsWithDishExpr);

然后最后构造 lambda:

var lambda = Expression.Lambda<Func<Item, bool>>(lambdaBody, item);

【讨论】:

假设有一个名为 Item 的类,你的最后一行应该是:var lambda = Expression.Lambda&lt;Func&lt;Item, bool&gt;&gt;(lambdaBody, item);

以上是关于Expression.Call 在简单的 lambda 表达式中。可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

为什么Expression.Call抛出参数错误

Phonics 自然拼读法 ar er ir or ur Teacher:Lamb

Phonics 自然拼读法 ar er ir or ur Teacher:Lamb

如何TBB获得150%LAMB的质押挖矿收益?

主网001提案|销毁Lambda研发团队持有的7亿LAMB投票通过

Lamb表达式匿名类实现接口方法