2008-10-31 94 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] 
    } 
} 

編輯:的原因陣列是,我需要由索引根據需要調用該委託功能。它們不是針對事件運行的。我在代碼中看到了一個嚴重的(愚蠢的)錯誤,因爲我試圖使用pd []類型而不是數組的名稱(委託)來執行委託函數。

回答

14

如果它們都是相同的類型,爲什麼不把它們組合成單個多播委託?

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

... 
pd(); 
+0

不會單獨處理任何代表拋出的異常的原因之一,而不是僅僅捕捉第一個。 – 2008-11-01 00:12:15

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

從技術上講,應該MyClass.pd [0] ()。 pd是一個類型,MyClass.pd是MyClass的靜態成員。 – 2008-10-31 22:41:11

+0

你爲什麼不把les PD結合在一起! – 2009-10-26 12:08:39

7

在.NET中,任何代表實際上實際上是「多播」代表,並且因此包含一個內部鏈表它可以包含任意數量的目標代表(從這個內置基類繼承)。

您可以通過調用委託本身的方法GetInvocationList()來訪問此列表。此方法返回一組委託...

唯一的限制是,給定委託的鏈接列表中的所有委託必須具有相同的簽名(具有相同的委託類型)。如果您需要您的集合能夠包含不同類型的代理,那麼您需要構建自己的列表或集合類。

但是,如果這是好的,那麼你就可以「呼叫」在一個給定的委託的調用列表中的代表是這樣的:

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
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()); 
     } 


    } 

}