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