Cod*_*ted 12 .net c# lambda expression-trees
我需要生成一个lambda表达式
item => item.Id > 5 && item.Name.StartsWith("Dish")
Run Code Online (Sandbox Code Playgroud)
好的,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);
Run Code Online (Sandbox Code Playgroud)
但第二部分对我来说更复杂......
var propName = Expression.Property(item,"Name");
var valueName = Expression.Constant("Dish");
Run Code Online (Sandbox Code Playgroud)
如何为propName调用StartsWith?
Ani*_*Ani 17
您必须得到一个MethodInfo
表示string.StartsWith(string)
方法,然后用于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);
Run Code Online (Sandbox Code Playgroud)
然后,您将&&
一起使用子表达式来创建主体.
var lambdaBody = Expression.AndAlso(idMoreThanFive, startsWithDishExpr);
Run Code Online (Sandbox Code Playgroud)
最后构建lambda:
var lambda = Expression.Lambda<Func<Item, bool>>(lambdaBody, item);
Run Code Online (Sandbox Code Playgroud)