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

Wil*_*cat 15 c# linq expression expression-trees

我创建了一个表达式,我正在使用它进行排序工作正常,直到我遇到一个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);
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮忙吗?

Jon*_*eet 35

只需在其中添加转化:

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


Ani*_*Ani 12

您似乎期望自动装箱值类型以匹配表达式的返回类型.不幸的是,Expression.Lambda不这样做.

你可以Expression.Convert用来执行拳击.

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

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

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

if(body.Type.IsValueType)
   body = Expression.Convert(body, typeof(object));
Run Code Online (Sandbox Code Playgroud)