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

我需要生成一个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");

如何调用StartsWith为作为propName?

--------------解决方案-------------

你必须得到一个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);

然后,你必须&&子表达式联手打造的身上。

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

然后最终构建的lambda:

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

分类:C# 时间:2015-03-15 人气:0
本文关键词: .NET,λ,表达式树
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.474 (s). 10 q(s)