L'espressione di tipo 'System.DateTime' non può essere utilizzata per il tipo di ritorno 'System.Object'

c# expression expression-trees linq

Domanda

Ho creato un'espressione che sto usando per l'ordinamento che funziona bene, fino a quando non prendo 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'

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?

Risposta accettata

Basta aggiungere una conversione lì:

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

Risposta popolare

Sembra che ti aspetti il ​​box automatico dei tipi di valori in modo che corrisponda al tipo di ritorno dell'espressione. Sfortunatamente, Expression.Lambda non lo fa.

Puoi 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 motivo non si desidera che l'operazione di conversione sia presente nell'espressione se la proprietà è già un tipo di riferimento, è possibile diramare come richiesto:

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

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché