Выражение типа "System.DateTime" не может использоваться для возвращаемого типа "System.Object"

Я создал выражение, которое я использую для сортировки, которое отлично работает, пока я не попаду в поле 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);

Может ли кто-нибудь помочь вообще?

Ответ 1

Просто добавьте конверсию:

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

Ответ 2

Кажется, вы ожидаете, что автоматическое боксирование типов значений будет соответствовать возвращаемому типу выражения. К сожалению, 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));