VB.NET

2010-01-29 14 views
7

में किसी ईवेंट का GetInvocationList मैं डब्ल्यूसीएफ एप्लिकेशन (सच्चा बाबर से) के उदाहरण का पालन करके कुछ डब्ल्यूसीएफ सिद्धांतों को सीखने की कोशिश कर रहा हूं।VB.NET

अब मैं VB.NET

private void BroadcastMessage(ChatEventArgs e) 
{ 

    ChatEventHandler temp = ChatEvent; 

    if (temp != null) 
    { 
     foreach (ChatEventHandler handler in temp.GetInvocationList()) 
     { 
      handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null); 
     } 
    } 
} 

में निम्नलिखित समारोह कन्वर्ट करने के लिए चाहते हैं, लेकिन मैं, कुछ समस्याएं हैं क्योंकि निम्न कोड संकलक द्वारा स्वीकार नहीं किया है

Private Sub BroadcastMessage(ByVal e As ChatEventArgs) 

    Dim handlers As EventHandler(Of ChatEventArgs) = ChatEvent 

    If handlers IsNot Nothing Then 

     For Each handler As EventHandler(Of ChatEventArgs) In handlers.GetInvocationList() 

      handler.BeginInvoke(Me, e, New AsyncCallback(AddressOf EndAsync), Nothing) 

     Next 

    End If 

End Sub 

यह

कहते हैं

सार्वजनिक साझा ईवेंट ChatEvent (प्रेषक ऑब्जेक्ट के रूप में, ई ChatEventArgs के रूप में) 'एक है घटना, और बात करने के लिए आ रहा है सीधे

नहीं कहा जा सकता, यह तो संचालकों किसी अन्य तरीके से एक निश्चित घटना से जुड़ा हुआ मिलता है VB.NET में संभव है?

उत्तर

7

उपयोग ChatEventEvent (या घटनानाम इवेंट)

यह IntelliSense में दिखाई नहीं देगा, लेकिन यह के सदस्यों होगा।

VB.NET पर्दे के पीछे एक चर बनाता है, सांकेतिक शब्दों में बदलनेवाला से जटिलता को छिपाने के लिए ...

इस वर्ग है कि घटना वाणी में ही उपलब्ध है (या शायद उसके वंश)

+0

बस ध्यान रखें कि आप अपनी कक्षा में एक अनियंत्रित सदस्य का उपयोग कर रहे हैं, और (जब तक मुझे गलत नहीं लगता) इस नामकरण नीति को भविष्य के कंपाइलर संस्करणों में रहने की गारंटी नहीं है। –

+0

@Adam - हाँ, निश्चित रूप से अनियंत्रित, जहां तक ​​मैंने देखा है, लेकिन मैं उन्हें तब तक नहीं देख सकता जब तक उनके पास कोई कारण न हो, या कम से कम एक विकल्प प्रदान न करें। किसी भी मामले में, यह एकमात्र तरीका है जिसे आप वर्तमान में कर सकते हैं, बिना किसी ईवेंट ईवेंट को अपने उदाहरण के अनुसार। यदि वे इसे बदलते हैं तो आपका काम अभी भी काम करेगा, लेकिन मैं उस काम को सहेजने की संभावना को छोड़ दूंगा। –

5

आप इस कक्षा को उस वर्ग में लिखने की कोशिश कर रहे हैं जो ChatEvent ईवेंट घोषित करता है। ऐसा नहीं किया जा सकता है, क्योंकि घटनाओं को कक्षा में केवल चर के रूप में माना जा सकता है (उन्हें आमंत्रित करने सहित)। ऐसा इसलिए है क्योंकि event कीवर्ड वास्तव में संकलक को इंगित करता है कि इसे कुछ पीछे के दृश्यों को बदलने की आवश्यकता है।

क्या होता है

इस घोषणा पर विचार करें:

Public Event MyEvent as EventHandler 

सरल पर्याप्त, है ना? यह वास्तव में क्या करता है, हालांकि, यह (आप बस यह नहीं दिख रहा है)

Private compilerGeneratedName as EventHandler 

Public Event MyEvent as EventHandler 
    AddHandler(ByVal value as EventHandler) 
     compilerGeneratedName += value 
    End AddHandler 
    RemoveHandler(ByVal value as EventHandler) 
     compilerGeneratedName -= value 
    End RemoveHandler 
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs) 
     compilerGeneratedName.Invoke(sender, e) 
    End RaiseEvent 
End Event 

और जब आप घटना आह्वान:

RaiseEvent MyEvent(Me, EventArgs.Emtpy) 

यह वास्तव में RaiseEvent ब्लॉक में कोड कहता है।

संपादित

VB.NET में घटनाओं चर कहीं भी (वे सी # में घोषित वर्ग, जिसके कारण आपके सी # उदाहरण संकलित में चर के रूप में इलाज किया जा सकता) के रूप में नहीं माना जा सकता है, तो तो आपको खुद को घटना को स्पष्ट रूप से कार्यान्वित करना होगा। इसे कैसे करें इसके बारे में अधिक जानकारी के लिए MSDN page on the Event statement देखें। एक लंबी कहानी कम करने के लिए, आप कई इवेंट हैंडलर स्टोर करने के लिए कुछ तरीका चाहते हैं (या GetInvocationList के साथ एक एकल ईवेंट हैंडलर का उपयोग करें, जैसा कि आप अभी करने की कोशिश कर रहे हैं)। आपके AddHandler और RemoveHandler कोड ब्लॉक में आप ईवेंट हैंडलर (क्रमशः) की सूची से जोड़ और निकाल देंगे।तो अब

Private myEventList as New List(Of EventHandler) 

Public Custom Event MyEvent as EventHandler 
    AddHandler(ByVal value as EventHandler) 
     myEventList.Add(value) 
    End AddHandler 
    RemoveHandler(ByVal value as EventHandler) 
     myEventList.Remove(value) 
    End RemoveHandler 
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs) 
     For Each evt in myEventList 
      evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing) 
     Next 
    EndRaiseEvent 
End Event 

, यदि आप

RaiseEvent MyEvent(Me, EventArgs.Emtpy) 

फोन यह फैशन आप उम्मीद कर रहे हैं में घटना को बढ़ा देंगे:

आप कुछ इस तरह इस्तेमाल कर सकते हैं।

+0

धन्यवाद जवाब के लिए, लेकिन मुझे नहीं लगता कि मेरा मामला है। मेरी कक्षा को चैट सेवा कहा जाता है और यह साझा ईवेंट चैटवेन्ट और उप ब्रॉडकास्ट मैसेज दोनों की घोषणा करता है, जहां मैं ChatEvent की आमंत्रण सूची प्राप्त करने का प्रयास कर रहा हूं। – Drake

+0

@marco: देखें कि मेरे संपादन उपरोक्त पहले उदाहरण में –

+1

अधिक उपयोगी हैं, तो compilerGeneratedName * हमेशा * घटना का नाम "ईवेंट" शब्द के बाद होता है, इसलिए, ChatEventEvent, इस मामले में। –