2013-07-06 29 views
5

Tôi đang cố gắng tạo một lớp bao bọc chung chung sẽ gọi các phương thức với các biểu thức lambda.tạo một lớp bao bọc chung chung sẽ gọi các phương thức với các biểu thức lambda

Mã này trông như thế này:

Các Wrapper Class:

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

Lớp mà được gói:

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

Nơi tôi đã thực hiện cuộc gọi:

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

Tôi đoán tôi phải atatch trường hợp của đối tượng đó là "dụ" để biểu thức phương pháp nhưng tôi không biết làm thế nào ..

Khi tôi chạy mã này tôi nhận được ngoại lệ này:

Biến ' x 'của loại' AsynCtry.Person 'được tham chiếu từ phạm vi' ', nhưng nó không được xác định.

Có cách nào để thực hiện việc này không?

Trả lời

8

Bạn không cần phải biểu cho điều này - chỉ cần sử dụng các đại biểu trực tiếp:

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

gọi phương pháp của bạn nên hoạt động, sau đó:

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

Yep ... Nó hoạt động :) Thanks a lot –

Các vấn đề liên quan