Convertir une expression en Expression.Lambda <Func<object, bool> &gt;

c# expression-trees lambda

Question

J'ai une méthode qui construit un arbre d'expression, basé sur le type de l'objet qui est transmis à la méthode. Une fois que l'arbre est construit, je veux le convertir et le renvoyer avec le type de retour comme indiqué ci-dessous.

public static Expression<Func<object, bool>> BuildExpression(Type type, ...)
{
    // build the expression...
    ParameterExpression param = Expression.Parameter(type, "m");
    Expression expression = null;

    // simplified version of building the expression tree
    MemberExpression member = Expression.Property(param, filter.Property);
    ConstantExpression constant = Expression.Constant(filter.Value);
    expression = Expression.Equal(member, constant);

   // ...

   // IT FAILS ON THIS LINE!!!
   return Expression.Lambda<Func<object, bool>>(expression, param);
}

J'ai examiné quelques réponses de conversion, mais en vain. Aucun conseil?

Réponse populaire

Voici votre code avec les modifications décrites dans mon précédent commentaire.

1) Votre fonction renvoie une expression décrivant une fonction avec un seul argument. Et cet argument est de type Object . Vous devez donc utiliser le type d’ Object lors de la création du paramètre "m".

2) Avant d’accéder au paramètre de propriété, il convient de rétablir le type souhaité. Voir Expression.Convert .

public static Expression<Func<object, bool>> BuildExpression(Type type, ...)
{
    // build the expression...
    ParameterExpression param = Expression.Parameter(typeof(Object), "m");
    Expression expression = null;

    UnaryExpression convert = Expression.Convert(param, type);

    // simplified version of building the expression tree
    MemberExpression member = Expression.Property(convert, filter.Property);
    ConstantExpression constant = Expression.Constant(filter.Value);
    expression = Expression.Equal(member, constant);

    // ...

    return Expression.Lambda<Func<object, bool>>(expression, param);
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi