2010-02-24 15 views
20

आंतरिक ऑब्जेक्ट इंस्टेंस से घटनाओं को निर्देशित करना संभव है कि इस तरह के वाक्यविन्यास के साथ कोरेंट ऑब्जेक्ट के ईवेंट हैंडलर:क्या सी # में इवेंट हैंडलर को "चेन" करना संभव है?

public class MyControl { 
    public event EventHandler Finish; 

    private Wizard wizard; 
    public MyControl(Wizard wizard) { 
     this.wizard = wizard; 

     // some other initialization going on here... 

     // THIS is what I want to do to chain events 
     this.wizard.Finish += Finish; 
    } 
} 

उपर्युक्त संरचना के लिए प्रेरणा यह है कि मेरे पास कई विज़ार्ड-जैसे यूआई प्रवाह हैं और अलग करना चाहते हैं पीछे, आगे & मेरे डिज़ाइन में खुले बंद सिद्धांत और एकल जिम्मेदारी सिद्धांत का सम्मान करने के लिए एक वर्ग में हैंडलिंग रद्द करें।

एक विधि जोड़ना ऑनफिनिश और सामान्य जांच करना हमेशा संभव होता है लेकिन अगर घोंसले की घटनाओं के बहुत सारे होते हैं, तो यह बहुत सारे बॉयलरप्लेट कोड के साथ खत्म हो जाएगा।

उत्तर

32

दो विकल्प। पहली:

public event EventHandler Finish 
{ 
    add { wizard.Finish += value; } 
    remove { wizard.Finish -= value; } 
} 

दूसरे, आप उल्लेख किया:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

private void WizardFinished(object sender, EventArgs e) 
{ 
    EventHandler handler = Finish; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

दूसरा रूप से लाभ यह है कि घटना के स्रोत तो मध्यवर्ती वर्ग, नहीं विज़ार्ड प्रतीत होता है - जो उचित है जैसा कि हैंडलर ने सदस्यता ली है।

+0

धन्यवाद, दूसरे विकल्प के पीछे तर्क इस तरह से सिस्टम को लागू करने के लिए पर्याप्त है। और पहले विकल्प के लिए भी धन्यवाद क्योंकि मुझे एहसास नहीं हुआ कि अतिरिक्त अधिभार जोड़ने के लिए एक वाक्यविन्यास था। – plouh

+0

जिज्ञासा से, आप शून्य के परीक्षण और समापन के लिए परीक्षण करने से पहले हैंडलर को फिनिश क्यों सौंपते हैं? – dckrooney

+0

@dcrooney: इसके बजाय हैंडलर को बुलाया जाना चाहिए था। संपादित करेंगे –

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