2008-10-31 20 views
9

मैं एक प्रतिनिधि सरणी से प्रतिनिधि कार्यों को कॉल करने के साथ प्रयोग कर रहा हूं। मैं प्रतिनिधियों की सरणी बनाने में सक्षम हूं, लेकिन मैं प्रतिनिधि को कैसे कॉल करूं?प्रतिनिधि एरे

public delegate void pd(); 

public static class MyClass 
{ 

    static void p1() 
    { 
     //... 
    } 

    static void p2() 
    { 
     //... 
    } 

    //... 

    static pd[] delegates = new pd[] { 

     new pd(MyClass.p1), 
     new pd(MyClass.p2) 
     /* ... */ 
    }; 
} 

public class MainClass 
{ 
    static void Main() 
    { 
     // Call pd[0] 
     // Call pd[1] 
    } 
} 

संपादित करें: सरणी के लिए कारण यह है कि मैं जरूरत के मुताबिक एक सूचकांक द्वारा प्रतिनिधि कार्यों कॉल करने की आवश्यकता है। वे किसी घटना के जवाब में नहीं चलते हैं। मुझे अपने कोड में एक महत्वपूर्ण (बेवकूफ) त्रुटि दिखाई देती है क्योंकि मैंने सरणी (प्रतिनिधि) के नाम के बजाय पीडी [] प्रकार का उपयोग करके प्रतिनिधि समारोह को निष्पादित करने का प्रयास किया था।

उत्तर

14

यदि वे सभी एक ही प्रकार के हैं, तो उन्हें केवल एक मल्टीकास्ट प्रतिनिधि में क्यों न जोड़ें?

static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...; 

... 
pd(); 
+0

एक कारण यह है कि किसी भी प्रतिनिधि द्वारा फेंकने वाले अपवादों को व्यक्तिगत रूप से पकड़ने के बजाय, पहले को पकड़ने के बजाय। –

+0

मेरे संपादन के अनुसार, प्रतिनिधियों को किसी घटना के जवाब में निष्पादित नहीं किया जाता है, लेकिन सरणी में इंडेक्स का उपयोग करके अलग-अलग कहा जाता है। – pro3carp3

+0

@jacob_c - हाँ, अगर आप वास्तव में करना चाहते हैं :) @ pro3carp3 - उस स्थिति में आपको केवल सरणी के लिए सामान्य के अनुसार इंडेक्स तक पहुंचने की आवश्यकता है। यहां एक प्रतिनिधि होने के बारे में कुछ खास नहीं है। –

7
public class MainClass 
{ 
    static void Main() 
    { 
     pd[0](); 
     pd[1](); 
    } 
} 
+0

तकनीकी तौर पर, कि MyClass.pd किया जाना चाहिए [0]()। पीडी एक प्रकार है, और MyClass.pd MyClass का स्थिर सदस्य है। –

+0

आप लेस पीडी को एक साथ क्यों नहीं जोड़ते हैं! –

7

नेट में, किसी भी प्रतिनिधि वास्तव में वास्तव में एक "बहुस्त्र्पीय" प्रतिनिधि, और इसलिए एक आंतरिक लिंक्ड सूची जो लक्ष्य प्रतिनिधियों के किसी भी संख्या को शामिल कर सकते हैं (यह इस में निर्मित आधार वर्ग से विरासत)।

आप प्रतिनिधि सूची में GetInvocationList() को कॉल करके इस सूची तक पहुंच सकते हैं। यह विधि Delegates की एक सरणी देता है ...

एकमात्र प्रतिबंध यह है कि किसी दिए गए प्रतिनिधि की लिंक्ड सूची के अंदर सभी प्रतिनिधियों के पास समान हस्ताक्षर होना चाहिए, (उसी प्रतिनिधि प्रकार का होना चाहिए)। यदि आपको अलग-अलग प्रकार के प्रतिनिधियों को शामिल करने में सक्षम होने के लिए अपने संग्रह की आवश्यकता है, तो आपको अपनी खुद की सूची या संग्रह कक्षा बनाने की आवश्यकता है।

लेकिन अगर यह ठीक है, तो आप "कहते हैं" इस तरह एक दिया प्रतिनिधि के मंगलाचरण सूची में प्रतिनिधियों कर सकते हैं:

public delegate void MessageArrivedHandler(MessageBase msg); 
public class MyClass 
{ 
    public event MessageArrivedHandler MessageArrivedClientHandler; 

    public void CallEachDelegate(MessageBase msg) 
    { 
      if (MessageArrivedClientHandler == null) 
       return; 
      Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList(); 
      foreach (Delegate d in clientList) 
      { 
       if (d is MessageArrivedHandler) 
        (d as MessageArrivedHandler)(msg); 
      } 
    } 
} 
3
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](); 
     pd[1](); 
    } 

    public delegate void delegates(); 

    static delegates[] pd = new delegates[] 
          { 
           new delegates(MyClass.p1), 
           new delegates(MyClass.p2) 
          }; 

    public static class MyClass 
    { 
     public static void p1() 
     { 
      MessageBox.Show("1"); 
     } 

     public static void p2() 
     { 
      MessageBox.Show("2"); 
     } 
    } 
} 
+0

यह "प्रतिनिधि" नहीं है "प्रतिनिधि" –

0
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](1); 
     pd[1](2); 
    } 

    public delegate void delegates(int par); 
    static delegates[] pd = new delegates[] 
            { 
             new delegates(MyClass.p1), 
             new delegates(MyClass.p2) 
            }; 
    public static class MyClass 
    { 

     public static void p1(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 

     public static void p2(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 


    } 

}