L'expression de type 'System.DateTime' ne peut pas être utilisée pour le type de retour 'System.Object'

c# expression expression-trees linq

Question

J'ai créé une expression que j'utilise pour le tri et qui fonctionne bien jusqu'à ce que je frappe un champ DateTime , où l'erreur suivante apparaît (sur la deuxième ligne):

L'expression de type 'System.DateTime' ne peut pas être utilisée pour le type de retour 'System.Object'

Voici mon code:

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

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

Est-ce que quelqu'un peut aider?

Réponse acceptée

Ajoutez juste une conversion dedans là:

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

Réponse populaire

Vous semblez s'attendre à ce que la mise en forme automatique des types de valeur corresponde au type de retour de l'expression. Malheureusement, Expression.Lambda ne le fait pas.

Vous pouvez utiliser Expression.Convert pour effectuer la boxe.

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

Si, pour une raison quelconque, vous ne souhaitez pas que l'opération de conversion soit présente dans l'expression si la propriété est déjà un type de référence, vous pouvez créer une branche si nécessaire:

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

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow