5 votes

créer une classe wrapper générique qui appellera les méthodes avec des expressions lambda

J'ai du mal à créer une classe générique qui appelle les méthodes avec des expressions lambda.

Le code ressemble à ceci :

La classe Wrapper :

public class Service<T>
{
    private T instance;

    public Service(T param)
    {
        this.instance = param;
    }

    public void Call<U>(Expression<Func<T, U>> aExpression, Action<U> returnClass)
    {
        var methodCallExpr = aExpression.Body as MethodCallExpression
        var lambdaToFunc = Expression.Lambda(methodCallExpr).Compile();
        returnClass((U)lambdaToFunc.DynamicInvoke());
    }
}

La classe qui est enveloppée :

public class Person
{
    public int GetPersonById(int bbb)
    {
        return bbb;
    }
}

L'endroit où j'ai passé l'appel :

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x =>x.GetPersonById(2),Console.WriteLine);

Je suppose que je dois récupérer l'instance de l'objet qui est " instance " à l'expression de la méthode, mais je ne sais pas comment

Lorsque j'exécute ce code, j'obtiens cette exception :

La variable 'x' de type 'AsynCtry.Person' est référencée depuis la portée '', mais elle n'est pas définie.

Y a-t-il un moyen de le faire ?

8voto

Reed Copsey Points 315315

Vous n'avez pas besoin d'expressions pour cela - utilisez simplement les délégués directement :

public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
{
    U result = aExpression(this.instance);
    returnClass(result);
}

Votre appel de méthode devrait donc fonctionner :

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x => x.GetPersonById(2), u => Console.WriteLine(u));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X