Выражение типа «System.DateTime» нельзя использовать для типа возвращаемого значения «System.Object». - PullRequest
15 голосов
/ 23 января 2012

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

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

Ответы [ 2 ]

33 голосов
/ 23 января 2012

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

Expression<Func<MyEntity, object>> sortExpression =
    Expression.Lambda<Func<AMyEntity, object>>(
        Expression.Convert(
            Expression.Property(param, sortKey),
            typeof(object)),
        param);
11 голосов
/ 23 января 2012

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