2013-07-06 3 views
5

람다식이있는 메서드를 호출하는 일반 래퍼 클래스를 만드는 데 어려움을 겪고 있습니다.람다 식으로 메서드를 호출하는 일반 래퍼 클래스를 만듭니다.

코드는 다음과 같습니다

래퍼 클래스 :

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

싸여 클래스 :

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

내가 전화했다 장소 :

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

나는 이 코드를 실행하면

내가이 예외를 얻을 .. 방법의 표현을 "예를"입니다 개체의 인스턴스를 atatch해야하지만 어떻게 나도 몰라 :

'

변수 범위 '에서 참조 된'AsynCtry.Person '유형의 x'가 정의되어 있지만 정의되지 않았습니다.

이 방법이 있습니까?

답변

8

이에 대한 표현이 필요하지 않습니다 - 단지 직접 대표단을 사용

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

귀하의 메서드 호출이 작동합니다, 다음 :

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

가 네 ... 그것은 작동합니다 :) 덕분에 많은 –