【问题标题】:Expression.Call in simple lambda expression. Is it possible?Expression.Call 在简单的 lambda 表达式中。可能吗?
【发布时间】: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?

【问题讨论】:

    标签: c# .net lambda expression-trees


    【解决方案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);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2011-04-21
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多