2015-01-06 26 views
5

Ben garip ama sadece tekmeler için soruyorum biliyorum, bir lambda ifade için MethodInfo almak mümkün mü?Bir lambda ifadesi için MethodInfo alın

(Func<int, string>(i => i.ToString())).MethodInfo

GÜNCELLEME Ben bakılmaksızın Lamda gövdesi bir yöntem çağrısı ifadesidir olup olmamasından yöntem bilgi almak isteyen , yani bakılmaksızın:

Böyle bir şeyden sonra ben lambda'nın bedeni ne tür bir ifade. Örneğin, örn.

Bu işe yarayabilir.

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => Program.GetNewDog(i); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), ((MethodCallExpression)(conversionExpression.Body)).Method); 

class Program 
{ 
    static Dog GetNewDog(int i) 
    { 
    return new Dog(); 
    } 
} 

Ama bu bile çalışmak istiyorum:

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => new Dog(); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), /*...???... */); 
+0

Bir ifadenin bir yöntem bilgisi yoktur. Derleme yaparsanız, delege yönteminden bilgi alabilirsiniz. – leppie

+0

Bir ifade oluşturmayla ilgilenmiyorum. Güncellemeyi Timothy Shields'ın yanıtına cevaben ekledim. Tek istediğim bir temsilci tarafından bir methodInfo. Mümkün? –

+1

Bu iyi çalışıyor (yeni Func (i => i.ToString())) Yöntem ' – leppie

cevap

6

Oldukça yakın :)

Böyle bir şey yapabilirsiniz:

MethodInfo meth = (new Func<int, string>(i => i.ToString())).Method; 

Not: Eğer bir temsilci örneğine birden abonelerini 'varsa, bu sorunları olabilir .

MSDN: http://msdn2.microsoft.com/en-us/library/system.delegate.method

+0

Ama nasıl anonim bir yöntem veya lambda için çoklu aboneler olabilir? Bildirildiği yer dışında herhangi bir yere nasıl başvurursunuz? –

+0

Önce temsilci ilan etmeli ve daha sonra ek aboneler eklemek için '+ =' kullanmalısınız. Anonim delege katılıyorum, bu senaryo çok olası değil. Ancak bunun için kontrol edebilir veya bu durumda "Yöntem" geçersiz olabilir. Ayrıca 'Hedef' özelliği boş değilse, temsilci bir bağlam olabilir farkında olun. – leppie

+0

Ah, şimdi ne demek istediğimi görüyorum. “Func ” 'un zaten kendi arama listesinde başka yöntemleri varsa, o zaman dikkatli ol, diyorsun değil mi? –

2

System.Linq.Expressions ad kullanarak, aşağıdakileri yapabilirsiniz.

Expression<Func<int, string>> expression = i => i.ToString(); 
MethodInfo method = ((MethodCallExpression)expression.Body).Method; 
+0

İlginç bir kesmek. Teşekkür ederim. :-) –

+0

Hayır, bekle. Bu sadece bu örnek için çalışacaktır. Benim hatam. Netleştirmeliydim. Lambda'nın vücudunun ne olduğuna bakılmaksızın çalışmasını istiyorum. Bu çözüm lambda kütlesinin bir yöntem çağrı ifadesi olduğunu varsayıyor, bu benim hatamdı, çünkü ben böyle bir örnek verdim. –