gpt4 book ai didi

C# 有没有办法在代码中解析 lambda 表达式的委托(delegate)类型

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:53 25 4
gpt4 key购买 nike

我的目标是支持应用程序中的排序,并通过将参数作为字符串接受的 REST 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>) 设置

最佳答案

我已经弄清楚我做错了什么。

首先:使用泛型方法创建表达式主体

// Generic Method, return type Expression<Func<User, int>>
Expression.Lambda<Func<User, int>>(sortExpression, parameter);

而不是传递 typeof(Func<User, int>)参数。

// Non-generic. Return type LambdaExpression
Expression.Lambda(typeof(Func<User, int>), sortExpression, parameter);

第二个:

我没有正确绑定(bind)参数,这使得表达式正在访问未提供给表达式的废弃参数的属性。

// I'm creating an expression to access the property of a newly created parameter.
var sortExpression = Expression.Property(Expression.Parameter(typeof(User)), sortBy);
var parameter = Expression.Parameter(typeof(User));
var expressionBody = Expression.Lambda<Func<User, int>>(sortExpression, parameter);

//Above causes an unbinded variable exception since there are two parameters, one of which is not passed/bound.

//Should be:
var parameter = Expression.Parameter(typeof(User));
var sortExpression = Expression.Property(parameter, sortBy);

关于C# 有没有办法在代码中解析 lambda 表达式的委托(delegate)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58079670/

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