2013-07-06 26 views
5

Ben lambda ifadelerle yöntemlerini arayacak genel sarmalayıcı sınıf oluşturmak için mücadele ediyorum ifadelerde.lambda'da yöntemlerini arayacak genel sarmalayıcı sınıf oluşturmak

kod şuna benzer:

Sarıcı Sınıfı:

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

sarılır sınıfı:

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

görüşmeyi yaptım Yer:

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

sanırım Bu kodu çalıştırdığınızda

ben bu istisna olsun .. yöntem ifadeye "örneği" dir nesnenin örneğini atatch zorunda ama nasıl bilmiyorum:

'

Değişken x' türündeki 'AsynCtry.Person '' kapsamından başvurulan', ancak tanımlı değil.

bunu yapmanın bir yolu var mı?

cevap

8

Bunun için ifadeleri gerekmez - sadece doğrudan delegeleri kullanın:

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

Kişisel yöntem çağrısı çalışmalıdır, o zaman:

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

Evet ... O inşaat :) Çok teşekkürler –

İlgili konular