2015-01-06 6 views
5

मुझे पता है कि मैं विचित्र से पूछ रहा हूं लेकिन सिर्फ किक्स के लिए, क्या लैम्ब्डा अभिव्यक्ति के लिए MethodInfo प्राप्त करना संभव है?लैम्ब्डा अभिव्यक्ति के लिए MethodInfo प्राप्त करें

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

अद्यतन मैं चाहे lamda के शरीर एक विधि कॉल अभिव्यक्ति है या नहीं विधि की जानकारी प्राप्त करना चाहते हैं, यानी की परवाह किए बिना:

मैं कुछ इस तरह के बाद कर रहा हूँ लैम्ब्डा का शरीर किस प्रकार की अभिव्यक्ति है।

तो, उदाहरण के लिए

यह काम कर सकता है।

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

लेकिन मैं भी इस काम करना चाहता हूँ:

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

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

एक अभिव्यक्ति में कोई विधि जानकारी नहीं है। यदि आप इसे संकलित करते हैं, तो आप प्रतिनिधि से विधि जानकारी प्राप्त कर सकते हैं। – leppie

+0

मुझे अभिव्यक्ति बनाने में कोई दिलचस्पी नहीं है। मैंने नीचे तीमुथियुस शील्ड्स के जवाब के जवाब में अद्यतन जोड़ा। मैं चाहता हूं कि एक प्रतिनिधि से एक methodInfo है। मुमकिन? –

+1

यह ठीक काम करता है '(नया Func (i => i.ToString())) विधि – leppie

उत्तर

6

आप काफी करीब हैं :)

आप कुछ इस तरह कर सकते हैं:

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

नोट: यह समस्याएं हो रही हों आप एक प्रतिनिधि उदाहरण के लिए कई 'ग्राहकों' अगर ।

एमएसडीएन: http://msdn2.microsoft.com/en-us/library/system.delegate.method

+0

लेकिन अज्ञात विधि या लैम्ब्डा के लिए कई ग्राहक कैसे हो सकते हैं? इसे घोषित किए जाने के अलावा किसी अन्य स्थान पर आप इसका संदर्भ कैसे देंगे? –

+0

आपको पहले प्रतिनिधि को घोषित करना होगा और फिर अतिरिक्त ग्राहकों को जोड़ने के लिए '+ =' का उपयोग करना होगा। मैं सहमत हूं, अज्ञात प्रतिनिधियों के साथ, यह परिदृश्य बहुत ही असंभव है। हालांकि आप इसके लिए जांच सकते हैं, या उस मामले में 'विधि' शून्य हो सकती है। यह भी ध्यान रखें कि प्रतिनिधि के पास कुछ संदर्भ हो सकता है यदि 'लक्ष्य' संपत्ति शून्य नहीं है। – leppie

+0

आह, अब मैं देखता हूं कि आपका क्या मतलब है। आप कह रहे हैं कि क्या 'Func ' पहले से ही इसकी आमंत्रण सूची में अन्य विधियां हैं, तो बस सावधान रहें, है ना? –

2

System.Linq.Expressions नाम स्थान का उपयोग करके आप निम्नलिखित कर सकते हैं।

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

दिलचस्प हैक। धन्यवाद। :-) –

+0

नहीं, प्रतीक्षा करें। यह केवल इस विशेष उदाहरण के लिए काम करेगा। मेरी गलती। मुझे स्पष्ट करना चाहिए था। मैं इसे काम करना चाहता हूं चाहे लैम्बडा के शरीर में क्या हो। यह समाधान मानता है कि लैम्ब्डा का शरीर एक विधि कॉल अभिव्यक्ति है, जो मेरी गलती है, क्योंकि मैंने ऐसा उदाहरण दिया है। –

संबंधित मुद्दे