2013-07-06 37 views
5

我奮力創建一個通用的包裝類,它將調用與lambda表達式的方法。創建一個通用的包裝類,它將調用方法與Lambda表達式

的代碼看起來是這樣的:

包裝類:

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

是的...它的工作原理:)非常感謝 –