gpt4 book ai didi

c# - 类型 'System.Int64' 的表达式不能用于返回类型 'System.Object'

转载 作者:行者123 更新时间:2023-11-30 16:52:48 31 4
gpt4 key购买 nike

我正在尝试创建以下形式的表达式:

e => e.CreationDate;

CreationDatelong 类型,但是我希望表达式返回一个 object

我想使用 object 作为返回类型,因为表达式是在运行时基于查询参数动态构建的。查询参数指定表达式中要访问的属性,例如:

> entities?order=creationDate
> entities?order=score

如您所见,我可以按不同类型的不同属性进行排序,因此返回类型 object 将允许我构建尽可能通用的表达式。

问题是当我尝试创建表达式时:

ParameterExpression entityParameter = Expression.Parameter(typeof(Entity), "e");
Expression propertyAccess = Expression.Property(entityParameter, property);
Expression<Func<Entity, object>> result = Expression.Lambda<Func<Entity, object>>(propertyAccess, entityParameter);

我得到以下异常:

Expression of type 'System.Int64' cannot be used for return type 'System.Object'

很奇怪,因为据我所知,所有类型都是从 object 扩展而来的(看来表达式树还不支持多态)。

尽管如此,我在网上搜索并偶然发现了这个类似的问题:

Expression of type 'System.Int32' cannot be used for return type 'System.Object'

正在关注 Jon Skeet的答案,我将最后一行修改为:

Expression<Func<Entity, object>> result = Expression.Lambda<Func<Entity, object>>(Expression.Convert(propertyAccess, typeof(object)), entityParameter);

这工作正常,但它不会生成我想要的表达式。相反,它会生成如下内容:

e => Convert(e.CreationDate)

我不能使用这个解决方案,因为如果表达式主体不是 MemberExpression(即,成员访问操作),程序稍后会抛出异常

我一直在网上寻找满意的答案,但找不到。

如何实现返回类型为 objecte => e.CreationDate

最佳答案

取决于您如何使用 result您可以使用委托(delegate)类型动态创建它 Func<Entity, long>并将其键入 LambdaExpression :

ParameterExpression entityParameter = Expression.Parameter(typeof(Entity), "e");
Expression propertyAccess = Expression.Property(entityParameter, property);
var funcType = typeof(Func<,>).MakeGenericType(typeof(Entity), property.PropertyType);
LambdaExpression result = Expression.Lambda(funcType, propertyAccess, entityParameter);

关于c# - 类型 'System.Int64' 的表达式不能用于返回类型 'System.Object',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32146571/

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