Construction d'un arbre d'expression à l'aide d'un indexeur de paramètre

c# expression expression-trees lambda linq

Question

Étant donné une classe qui a une propriété qui est un dictionnaire

public class Product
{
    public Dictionary<string, string> Attributes { get { return attributes; } }

    private Dictionary<string, string> attributes = new Dictionary<string, string>();
}

Je souhaite pouvoir faire correspondre les produits dans une liste de produits en fonction de critères extraits d'un magasin de données et se présentant sous le format suivant:

public class Product
{
    public Dictionary<string, string> Attributes { get { return attributes; } }

    private Dictionary<string, string> attributes = new Dictionary<string, string>();
}

Mon approche actuelle consiste à construire une expression à partir du filtre, puis à transmettre cette expression en tant que paramètre à un appel de méthode LINQ Where comme suit

public class Product
{
    public Dictionary<string, string> Attributes { get { return attributes; } }

    private Dictionary<string, string> attributes = new Dictionary<string, string>();
}

myConstructedExpression serait normalement une expression lamda qui ressemble à

public class Product
{
    public Dictionary<string, string> Attributes { get { return attributes; } }

    private Dictionary<string, string> attributes = new Dictionary<string, string>();
}

J'ai assemblé le code suivant à des fins de test, mais l'appel à lambda.Compile() échoue toujours indépendamment de ce que j'ai essayé car il a quitté expression.

public class Product
{
    public Dictionary<string, string> Attributes { get { return attributes; } }

    private Dictionary<string, string> attributes = new Dictionary<string, string>();
}

Des questions

  1. Est-ce même une approche raisonnable et, si oui,
  2. Comment construire l'expression de gauche?

Réponse acceptée

Donc, pour obtenir p => p.Attributes["Brand"] <someoperator> "Tyco" , vous pouvez le faire.

Le "truc", pour travailler avec des types indexés, consiste à utiliser leur propriété Item (vous pouvez aussi travailler avec la méthode get_item )

var parameter = Expression.Parameter(typeof(Product), "p");
Expression left = Expression.Property(parameter, "Attributes");
left = Expression.Property(left, "Item", new Expression[] { Expression.Constant(attribute) });

MODIFIER

la version avec le test IDictionary.ContainsKey(<value>)

vraiment, étape par étape, mais je pense que cela rend les choses plus claires au début.

var parameter = Expression.Parameter(typeof(Product), "p");
Expression left = Expression.Property(parameter, "Attributes");
left = Expression.Property(left, "Item", new Expression[] { Expression.Constant(attribute) });



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