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