2012-01-23 13 views
14

Ho creato un'espressione che sto usando per l'ordinamento che funziona bene, fino a quando non premo un campo DateTime, dove ottengo il seguente errore (sulla seconda riga):L'espressione di tipo 'System.DateTime' non può essere utilizzata per il tipo di ritorno 'System.Object'

Espressione di tipo 'System.DateTime' non può essere usato per il tipo di ritorno 'System.Object'

Ecco il mio codice:

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

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

Qualcuno può aiutare a tutti?

+2

possibile duplicato [Espressione di tipo 'System.Int32' non può essere utilizzata per il tipo di ritorno 'System.Object'] (http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- per-return-type-system-object) – nawfal

risposta

30

Basta aggiungere una conversione in là:

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

È sembrano essere in attesa di auto-boxing del valore-tipo in base al return-tipo dell'espressione. Sfortunatamente, Expression.Lambda non lo fa.

È possibile utilizzare Expression.Convert per eseguire la boxe.

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

Se per qualche ragione non si desidera che l'operazione di conversione di essere presente nell'espressione se la proprietà è già un punto di riferimento di tipo, si può diramare come richiesto:

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

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

Funziona perfettamente - molte grazie! – Wildcat

Problemi correlati