2013-07-06 4 views
5

Próbuję utworzyć ogólną klasę opakowania, która wywoła metody z wyrażeniami lambda.Utwórz ogólną klasę opakowania, która wywoła metody z wyrażeniami lambda

Kod wygląda następująco:

owijki Klasa:

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()); 
    } 
} 

Klasa, która jest owinięta:

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

miejsce gdzie sprawdził:

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

Chyba ja trzeba atatch wystąpienie obiektu, który jest „instancja” do wyrażenia metody, ale nie wiem jak ..

Kiedy uruchomić ten kod i uzyskać ten wyjątek:

Zmienna " x 'typu "AsynCtry.Person" przywoływany z zakresu "", ale nie jest zdefiniowany.

Czy istnieje sposób, aby to zrobić?

Odpowiedz

8

Nie potrzeba wyrażenia na to - tylko bezpośrednio korzystać delegatów:

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

Rozmowa metoda powinna działać, a następnie:

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

Tak ... To działa :) dziękuję –