繁体   English   中英

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

[英]Expression.Call in simple lambda expression. Is it possible?

我需要生成一个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?

您必须获取表示string.StartsWith(string)方法的MethodInfo ,然后使用Expression.Call构造表示instancemethod调用的表达式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM