【发布时间】:2019-09-24 11:48:47
【问题描述】:
我的目标是支持应用程序中的排序并通过 REST API 公开它,该 API 将接受参数作为字符串。
目前的实现大致如下:
GetUsers (Expression<Func<User, int>> sortExpression) {
// Retrieve users ...
return users.orderBy(sortExpression);
}
Usage example:
var users = GetUsers(u => u.Id);
Expression<Func<User, int>> sortExpression 在我们的存储库中被广泛使用,更改它会很困难。
我想做的是能够将u => u.Id 与运行时生成的东西交换。
到目前为止,我所拥有的是:
// sortBy is retrieved from the calling method.
var type = typeof(User).GetProperties().FirstOrDefault(x => x.Name == sortBy).GetType();
var sortExpression = Expression.Property(Expression.Parameter(typeof(User)), sortBy);
var parameter = Expression.Parameter(typeof(User));
var expressionBody = Expression.Lambda(typeof(Func<User, int>), sortExpression, parameter);
var users = GetUsers(expressionBody)
我可以在运行时看到这确实创建了一个符合我需要的表达式,但错误是 Argument 5: cannot convert from 'LambdaExpression' to 'Expression<System.Func<User, int>>',即使表达式的主体应该由 typeof(Func<User, int>) 设置
【问题讨论】:
-
您只需要将
LambdaExpression转换为Expression<Func<User, int>>,例如:var expressionBody = (Expression<Func<User, int>>)Expression.Lambda(typeof(Func<User, int>), sortExpression, parameter); -
谢谢。我也完全错过了使用
Expression.Lambda<Func<User, int>>(sortExpression, parameter);创建表达式的通用方法
标签: c# generics lambda reflection