gpt4 book ai didi

c# - 无法将 lambda 表达式转换为类型 'System.Linq.Expressions.Expression',因为它不是委托(delegate)类型

转载 作者:行者123 更新时间:2023-11-30 13:19:07 26 4
gpt4 key购买 nike

我正在尝试创建此 lambda (x => x.MenuItemId) 但我不确定该怎么做。

var item = Expression.Parameter(typeof(MenuItem), "x");
var prop = Expression.Property(item, "MenuItemId");
var lambda = Expression.Lambda<Func<MenuItem, object>>(x => x.MenuItemId);

最佳答案

你想用你已经声明的项目和 Prop 创建 lambda

var lambda = Expression.Lambda<Func<MenuItem, object>>(prop, item);

您还可以选择将生成的 lambda 强类型化为 x.MenuItemId 的类型 - 如果它是一个 string,则如下所示:

var lambda = Expression.Lambda<Func<MenuItem, string>>(prop, item);

您将使用 Compile() 调用生成的 lambda,然后在您将使用 lambda 的地方使用它。

例如,如果您有一个名为 itemsMenuItem 集合,并且您想要所有 MenuItemId:

var compiled = lambda.Compiled(); 
var itemIds = items.Select(compiled); // roughly equivalent items.Select(x => x.MenuItemId);

我写了一个小工具类(呃,我知道)来包装这个功能:

static class Gen<TModel, TProp> {
public static Func<TModel, TProp> SelectorExpr(string propertyName) {
var pExpr = Expression.Parameter(typeof (TModel));
var mExpr = Expression.Property(pExpr, propertyName);
var lExpr = Expression.Lambda<Func<TModel, TProp>>(mExpr, pExpr);
return lExpr.Compile();
}
}

上面的用法:

var results = items.Select(Gen<MenuItem, object>.SelectorExpr("MenuItemId"));

关于c# - 无法将 lambda 表达式转换为类型 'System.Linq.Expressions.Expression',因为它不是委托(delegate)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30145039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com