C# 无法将lambda表达式转换为类型';System.Linq.Expressions.Expression';因为它不是委托类型

C# 无法将lambda表达式转换为类型';System.Linq.Expressions.Expression';因为它不是委托类型,c#,lambda,C#,Lambda,我正在尝试创建这个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); var i

我正在尝试创建这个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);
var item=Expression.Parameter(typeof(MenuItem),“x”);
var prop=Expression.Property(项目“MenuItemId”);
var lambda=Expression.lambda(x=>x.MenuItemId);

您希望使用已声明的项目和道具创建lambda

var lambda = Expression.Lambda<Func<MenuItem, object>>(prop, item);
您可以使用
Compile()
调用生成的lambda,然后在需要使用lambda的地方使用它

例如,如果您有一个名为
项的
菜单项的集合,并且需要所有
菜单项ID

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();
    }
}
静态类Gen{
公共静态函数SelectorExpr(字符串属性名称){
var pExpr=Expression.Parameter(typeof(TModel));
var mExpr=Expression.Property(pExpr,propertyName);
var-lExpr=Expression.Lambda(mExpr,pExpr);
返回lExpr.Compile();
}
}
使用上述各项:

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

请注意:如果您知道lambda表达式在设计时的样子(而不是在编译时根据变量计算),那么下面的代码应该会生成您需要的表达式树:

Expression<Func<MenuItem, object>> lambda = x => x.MenuItemId;
表达式lambda=x=>x.MenuItemId;
如果片段本身始终相同,则无需逐个构建表达式。;)

Expression<Func<MenuItem, object>> lambda = x => x.MenuItemId;