Der Ausdruck vom Typ 'System.DateTime' kann nicht für den Rückgabetyp 'System.Object' verwendet werden.

c# expression expression-trees linq

Frage

Ich habe einen Ausdruck erstellt, den ich zum Sortieren verwende, was gut funktioniert, bis ich ein DateTime Feld DateTime , wo ich den folgenden Fehler (in der zweiten Zeile) erhalte:

Der Ausdruck vom Typ 'System.DateTime' kann nicht für den Rückgabetyp 'System.Object' verwendet werden.

Hier ist mein Code:

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

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

Kann mir überhaupt jemand helfen?

Akzeptierte Antwort

Fügen Sie einfach eine Konvertierung hinzu:

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

Beliebte Antwort

Sie erwarten, dass das automatische Boxing von Werttypen mit dem Rückgabetyp des Ausdrucks übereinstimmt. Leider tut dies Expression.Lambda nicht.

Sie können Expression.Convert zum Ausführen des Boxens verwenden.

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

Wenn Sie aus irgendeinem Grund nicht möchten, dass der Konvertierungsvorgang im Ausdruck vorhanden ist, wenn die Eigenschaft bereits ein Referenztyp ist, können Sie wie erforderlich verzweigen:

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

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow