creare una classe wrapper generica che chiamerà i metodi con espressioni lambda

c# expression-trees generics lambda

Domanda

Sto facendo fatica a creare una classe wrapper generica che chiamerà i metodi con espressioni lambda.

Il codice si presenta così:

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 che è avvolta:

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

Il luogo in cui ho effettuato la chiamata:

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

Suppongo di dover ricorrere all'istanza dell'oggetto che è " istanza " per l'espressione del metodo ma non so come ..

Quando eseguo questo codice ottengo questa eccezione:

Variabile 'x' di tipo 'AsynCtry.Person' referenziata dall'ambito '', ma non è definita.

C'è un modo per fare questo?

Risposta accettata

Non hai bisogno di espressioni per questo - basta usare direttamente i delegati:

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

La tua chiamata al metodo dovrebbe funzionare, quindi:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché