2012-01-23 36 views
14

He creado una expresión que estoy usando para ordenar que funciona bien, hasta que toco un campo DateTime, donde obtengo el de error (en la segunda línea) siguiente:Expresión del tipo 'System.DateTime' no se puede utilizar para el tipo de retorno 'System.Object'

Expresión de tipo 'System.DateTime' no se puede utilizar para el tipo de retorno 'System.Object'

Aquí está mi código:

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

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

¿Alguien puede ayudar en absoluto?

+2

posible duplicado de [La expresión del tipo 'System.Int32' no se puede usar para el tipo de retorno 'System.Object'] (http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- for-return-type-system-object) – nawfal

Respuesta

30

Sólo tiene que añadir la conversión de allí:

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

Parece que está esperando auto-boxing de los tipos de valor para que coincida con el tipo de retorno de la expresión. Desafortunadamente, Expression.Lambda no hace esto.

Puede usar Expression.Convert para realizar el boxeo.

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

Si por alguna razón usted no desea que la operación de conversión de estar presente en la expresión si la propiedad es ya un tipo de referencia, que puede diversificarse según sea necesario:

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

if(body.Type.IsValueType) 
    body = Expression.Convert(body, typeof(object)); 
+0

Funciona perfectamente, ¡muchas gracias! – Wildcat

Cuestiones relacionadas