2010-10-14 16 views
6

के रूप में प्रतिनिधि को पास करना मैं वर्तमान में एक ईवेंट मैनेजर क्लास विकसित कर रहा हूं ताकि यह सुनिश्चित किया जा सके कि मृत डब्ल्यूसीएफ डुप्लेक्स ग्राहकों को कोई भी घटना नहीं छोड़ी जा सके, और एक ही ग्राहक से एक ही घटना में कई तारों को रोकने के लिए भी।विधि पैरामीटर

अब मूल रूप से, मैं अटक गया हूं कि घटना प्रतिनिधि को ऐसे फ़ंक्शन में पास करने का प्रयास कर रहा है जो इस तरह के असाइनमेंट को नियंत्रित करेगा।

var handler = new SomeEventHandler(MyHandler); 
Wire(myObject.SomeEventDelegate, handler); 

इस कॉल करने के लिए:

private void Wire(Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate = Delegate.Combine(eventDelegate, handler); 
    // Post actions (storing subscribed event delegates in a list) 
} 

अद्यतन

SomeEventDelegate आवरण के लिए कोड है:

public Delegate SomeEventDelegate 
{ 
    get { return SomeEvent; } 
    set { SomeEvent = (SomeEventHandler) value; } 
} 

event SomeEventHandler SomeEvent; 

जाहिर प्रतिनिधि myObject को वापस नहीं किया जा रहा है। SomeEventDelegate और मैं इस विधि से प्रतिनिधि को वापस नहीं कर सकता क्योंकि मुझे इसके बाद कुछ सत्यापन की आवश्यकता है। क्या आपको यह करने का कोई विचार है कि यह कैसे करें?

+0

आप + = – Andrey

+1

सी # घटनाओं आप के लिए एक छिपे हुए प्रतिनिधि उत्पन्न का उपयोग कर प्रतिनिधियों को जोड़ सकते हैं। इस घटना तक पहुंचने के लिए, देखें: http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up/1129530#1129530। –

+0

http://izlooite.blogspot.com/2011/02/delegates-vs-methods.html –

उत्तर

5

उपयोग C# ref parameter modifier:

var handler = new SomeEventHandler(MyHandler); 
Wire(ref myObject.SomeEventDelegate, handler); 

private void Wire(ref Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate = Delegate.Combine(eventDelegate, handler); 
    // Post actions (storing subscribed event handlers in a list) 
} 

यह भी ध्यान रखें कि कुछ अच्छा वाक्यात्मक चीनी (सी # 2.0) के रूप में बताए और प्रतिनिधियों के संयोजन के लिए मौजूद है (this article देखते हैं, उदाहरण के लिए):

Wire(ref myObject.SomeEventDelegate, MyHandler); 

private void Wire(ref Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate += handler; 
    // Post actions (storing subscribed event handlers in a list) 
} 

यह मुझे बताया गया है कि ref केवल फ़ील्ड के साथ काम करता है, गुण नहीं। एक संपत्ति के मामले में, एक मध्यस्थ चर इस्तेमाल किया जा सकता:

var tempDelegate = myObject.SomeEventDelegate; 
Wire(ref tempDelegate, MyHandler); 
myObject.SomeEventDelegate = tempDelegate; 
+0

ध्यान दें कि यह केवल तभी काम करेगा जब SomeeventDelegate एक फ़ील्ड है ... गुणों को रेफ पैरामीटर –

+0

हाय के रूप में पारित नहीं किया जा सकता है, रेफरी कीवर्ड यहां काम नहीं करता है क्योंकि myObject.SomeEventDelegate सिर्फ एक रैपर संपत्ति है जो इवेंट प्रतिनिधि को अपनी कक्षा के बाहर सुलभ बनाने के लिए है। –

+0

@ थॉमस: आह, अच्छा बिंदु। मैं उसके बारे में भूल गया था। उस स्थिति में, एक मध्यस्थ चर का उपयोग किया जा सकता है। संपादन ... – Cameron

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