Expression of type 'System.DateTime' canno

2019-02-21 08:54发布

I've created an expression that I'm using for sorting which works fine, until I hit a DateTime field, where I get the following error (on the second line):

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

Here's my code:

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

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

Can anyone help at all?

2条回答
爷的心禁止访问
2楼-- · 2019-02-21 09:11

Just add a conversion in there:

Expression<Func<MyEntity, object>> sortExpression =
    Expression.Lambda<Func<AMyEntity, object>>(
        Expression.Convert(
            Expression.Property(param, sortKey),
            typeof(object)),
        param);
查看更多
贪生不怕死
3楼-- · 2019-02-21 09:27

You appear to be expecting auto-boxing of value-types to match the return-type of the expression. Unfortunately, Expression.Lambda does not do this.

You can use Expression.Convert to perform the boxing.

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

If for some reason you don't want the conversion operation to be present in the expression if the property is already a reference-type, you can branch as required:

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

if(body.Type.IsValueType)
   body = Expression.Convert(body, typeof(object));
查看更多
登录 后发表回答