2011-09-09 18 views
19

तो मैं 2 वर्गों नाम के एक है और बीगतिशील रूप से आवंटित विधि/विधि के रूप में चर

एक एक विधि "सार्वजनिक शून्य फू()" है।

बी में कई अन्य विधियां हैं।

मुझे कक्षा बी में एक चर है, जिसे कक्षा ए की Foo() विधि असाइन की जाएगी। यह चर बाद में "निष्पादित" होना चाहिए (=> इसलिए इसे कक्षा ए के असाइन किए गए विधि को निष्पादित करना चाहिए) ।

यह कैसे करें?

उत्तर

7

रीड ने आपको सही उत्तर दिया। यह भी ध्यान देने योग्य है कि आप कार्रवाई के अलावा अन्य प्रतिनिधि हस्ताक्षरों का उपयोग कर सकते हैं।

जेनेरिक संस्करण Action<T> (एक आर्ग), Action<T1, T2> (दो args), आदि जैसे ... इसके अलावा, अगर आपके विधि एक वापसी प्रकार है, बाहर Func<T, TResult> जाँच कर रहे हैं।

या निश्चित रूप से आप अपने खुद के प्रतिनिधि के प्रकार को परिभाषित कर सकते हैं।

48

ऐसा लगता है कि आप यहां delegate का उपयोग करना चाहते हैं।

मूल रूप से, आप वर्ग 'बी' में, जोड़ सकते हैं:

class B 
{ 
    public Action TheMethod { get; set; } 
} 

class A 
{ 
    public static void Foo() { Console.WriteLine("Foo"); } 
    public static void Bar() { Console.WriteLine("Bar"); } 
} 

फिर आप सेट कर सकते हैं:

B b = new B(); 

b.TheMethod = A.Foo; // Assign the delegate 
b.TheMethod(); // Invoke the delegate... 

b.TheMethod = A.Bar; 
b.TheMethod(); // Invoke the delegate... 

यह प्रिंट आउट होगा "फू" फिर "बार"।

+1

+1 एक स्पष्ट, सरल उदाहरण – JohnD

+0

thx के लिए यह बहुत काम कर रहा है। मुझे "एक्शन" कीवर्ड याद आ रहा था :) – nr1

+1

@ nr1: वास्तव में वहां कई विकल्प हैं - 'एक्शन' आपको ऐसी विधि का उपयोग करने की अनुमति देगा जो मूल्य वापस नहीं करता है और कोई पैरामीटर नहीं लेता है। आप 'Func ' का उपयोग कर सकते हैं यदि आपके तरीके सभी एक int लेते हैं और एक स्ट्रिंग वापस करते हैं, उदाहरण के लिए। –

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