Comment changer un type dans un arbre d'expression?

c# expression-trees

Question

J'ai une méthode comme celle-ci:

private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
    /* Some code that will call Method_2 */
}

Dans cette méthode, je souhaite changer le type IPerson en un autre type. Je veux appeler une autre méthode qui ressemble à ceci:

private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
    /* Some code that will call Method_2 */
}

Ainsi, dans method_1 je dois modifier IPerson en PersonData . Comment puis-je faire ceci?

Modifier:

Lorsque j'appelle: Method_1(p => p.Id == 1) je souhaite "enregistrer" la condition ( p.Id == 1 ), mais je souhaite l'exécuter sur un autre type, à savoir IPerson . Donc, je dois modifier l'expression ou créer une nouvelle expression avec IPerson

EDIT II:

Pour ceux qui sont intéressés, voici (pour l'instant) ma solution:

private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
    /* Some code that will call Method_2 */
}

Et c'est comme ça que je l'utilise:

private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
    /* Some code that will call Method_2 */
}

Réponse acceptée

Si vous utilisez .net 4 (mise à jour: comme indiqué dans le commentaire, ExpressionVisitor été ajouté à la version 4 et non à la version 4.5), il serait nécessaire de rechercher Google dans les anciens cadres:

Il existe certaines hypothèses, mais je pense qu'elles sont valables pour votre scénario DTO et votre entité - les propriétés auxquelles vous accédez doivent correspondre.

class PersonData
{
    public bool Prop { get; set; }
}

interface IPerson 
{
    bool Prop { get; set; }
}

Dans la classe .net 4, une classe ExpressionVisitor définie facilite grandement la tâche si vous utilisez une version plus ancienne, vous devez écrire ou trouver son implémentation:

class PersonData
{
    public bool Prop { get; set; }
}

interface IPerson 
{
    bool Prop { get; set; }
}

Preuve de concept:

class PersonData
{
    public bool Prop { get; set; }
}

interface IPerson 
{
    bool Prop { get; set; }
}

Notez que cela fonctionnera pour les expressions simples. Si vous devez gérer x.Prop.Prop1 < 3 vous devez l'étendre davantage.




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