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?
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));