类型为'System.DateTime'的表达式不能用作返回类型为'System.Object'的返回值。

20

我创建了一个用于排序的表达式,它可以正常工作,直到我遇到一个DateTime字段,此时我会遇到以下错误(在第二行):

类型为'System.DateTime'的表达式不能用于返回类型 'System.Object'

这是我的代码:

ParameterExpression param = Expression.Parameter(typeof(MyEntity), "x");

Expression<Func<MyEntity, object>> sortExpression =
    Expression.Lambda<Func<AMyEntity, object>>(
        Expression.Property(param, sortKey), param);

有人能帮忙吗?


3
可能是[Expression of type 'System.Int32' cannot be used for return type 'System.Object']的重复问题。原链接为:https://dev59.com/gHI95IYBdhLWcg3wsQBm - nawfal
2个回答

44

只需在其中添加一个转换:

Expression<Func<MyEntity, object>> sortExpression =
    Expression.Lambda<Func<AMyEntity, object>>(
        Expression.Convert(
            Expression.Property(param, sortKey),
            typeof(object)),
        param);

16

你似乎期望值类型的自动装箱与表达式的返回类型匹配。不幸的是,Expression.Lambda不能做到这一点。

你可以使用Expression.Convert来执行装箱操作。

var body = Expression.Convert(Expression.Property(param, sortKey), typeof(object));
var sortExpression = Expression.Lambda<Func<AMyEntity, object>>(body, param);

如果由于某种原因,如果属性已经是引用类型,您不希望在表达式中出现转换操作,则可以根据需要进行分支处理:

Expression body = Expression.Property(param, sortKey);

if(body.Type.IsValueType)
   body = Expression.Convert(body, typeof(object));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接