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<Func<Item, bool>>(lambdaBody, item);
以上是关于Expression.Call 在简单的 lambda 表达式中。可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
Phonics 自然拼读法 ar er ir or ur Teacher:Lamb
Phonics 自然拼读法 ar er ir or ur Teacher:Lamb