2012-07-31 26 views
6

लौटती है हाय मैं इस तरह कुछ हासिल करने की कोशिश कर रहा हूं;लैम्ब्डा अभिव्यक्ति जो एक प्रतिनिधि

Method<TObjectType>(m=>m.GetData); //m is the instance of TObjectType 

यदि मैं उस पर सफल कर सकते हैं, तो मैं इस अभिव्यक्ति पर जाएँ और GetData विधि मिलता है और एक गतिशील एसक्यूएल क्वेरी बनाने के लिए उपयोग कर सकते हैं। मैं एक स्ट्रिंग के रूप में विधि नाम देकर ऐसा कर सकता हूं हालांकि मैं अपने डेवलपर मित्रों की दृढ़ता से टाइप दुनिया को तोड़ना नहीं चाहता हूं।

मुझे पता है कि मुझे प्रतिनिधि की सटीक परिभाषा देना है लेकिन यह अभी भी मेरी मदद नहीं करता है;

void Method<TObjectType>(Expression<Func<TObjectType, Delegate>> ex){/**/} 

क्या आपके पास कोई विचार है?

+0

आप 'GetData()' बारे में कुछ पता है? क्या आप जानते हैं कि इसमें हमेशा शून्य पैरामीटर होंगे, या ऐसा कुछ होगा? – svick

+0

यदि आप गेटडाटा विधि के हस्ताक्षर को नहीं जानते हैं तो आप दृढ़ता से टाइप की गई दुनिया छोड़ देंगे। –

+0

यह आपकी मदद कर सकता है http://stackoverflow.com/questions/2840438/lambda-returning-another-lambda – Vinoth

उत्तर

6

दुर्भाग्यवश, "प्रतिनिधि" जैसी कोई चीज़ नहीं है। अधिकांश उद्देश्यों के लिए (और विशेष रूप से: MethodInfo को हल करने के लिए), यह दृढ़ता से टाइप किए गए प्रतिनिधि होना चाहिए। ऐसा इसलिए है क्योंकि GetDataविधि नहीं है, यह विधि समूह है। आपको वास्तव में विधि को सटीक रूप से निर्दिष्ट करने की आवश्यकता है, या एक ज्ञात प्रतिनिधि-प्रकार है (जो अंत में एक ही चीज़ करता है)।

आपके पास दो व्यावहारिक विकल्प हैं; object पर काम करें, या एक सामान्य जोड़ें। उदाहरण के लिए:

void Method<TObjectType>(Expression<Func<TObjectType,object>> ex) {...} 

के रूप में, काम करेंगे होगा:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,TValue>> ex) {...} 

फोन करने वाले का प्रयोग करेंगे:

Method<Foo>(x => x.GetData()); 

आप वास्तव में एक प्रतिनिधि उपयोग करना चाहते हैं, प्रकार अनुमानित होना चाहिए, उदाहरण के लिए:

void Method<TObjectType>(Expression<Func<TObjectType,Func<int>>> ex) 

की इजाजत दी:

Method<Foo>(x => x.GetData); 

वैकल्पिक रूप से, अगर आप (उदाहरण के लिए) है कि विधि हमेशा parameterless है पता है, लेकिन आप वापसी प्रकार पता नहीं है; शायद की तरह कुछ:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,Func<TValue>>> ex) 

की अनुमति देता है:

Method<Foo, int>(x => x.GetData); 
+0

के साथ कुछ परिभाषित करना चाहते हैं। मुझे लगता है कि आप मानते हैं कि GetData विधि पैरामीटर रहित है ताकि आप इसे Func का उपयोग करके परिभाषित कर सकें। जिसका मतलब है, मुझे बहुत सारी विधि ओवरराइड बनाना है, क्या मैं सही हूँ? –

+0

@lazycoder मैं इसके खिलाफ सलाह दूंगा, क्योंकि आप सामान्य प्रकार के तर्कों की पागल संख्या के साथ एक विधि बनायेंगे, जो कि कॉल करने के लिए असुविधाजनक है। मैं वास्तव में 'x.GetData() 'निर्दिष्ट कॉलर के साथ सरल' ऑब्जेक्ट '/' टीवील्यू' दृष्टिकोण की सलाह दूंगा। अधिक जटिल अधिभारों के लिए, वे हमेशा 'x.GetData (123, "abc", dateTime.Now) निर्दिष्ट कर सकते हैं। - अभिव्यक्ति वृक्ष आपको बताएगा कि वे किस अधिभार का उपयोग करते हैं, और (यदि आप उन्हें चाहते हैं) पैरामीटर मान। –

+0

@lazycode सबसे खराब मामला, फिर आपको दो अधिभार की आवश्यकता है; एक 'Func ', एक' एक्शन ' ('शून्य 'विधियों के लिए) –

0

क्या आप इस तरह कुछ ढूंढ रहे हैं?

object InvokeMethod(Delegate method, params object[] args){ 
    return method.DynamicInvoke(args); 
} 

int Add(int a, int b){ 
    return a + b; 
} 

void Test(){ 
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4)); 
} 
+0

उत्तर के लिए धन्यवाद लेकिन मैं इस विधि को नहीं खोलना चाहता हूं, मैं चाहता हूं कि डेवलपर्स दृढ़ता से टाइप किए गए –