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[] 型を使用してデリゲート関数を実行しようとしたため、コードに重大な (ばかげた) エラーが表示されます。

4

5 に答える 5

15

それらがすべて同じタイプである場合、それらを 1 つのマルチキャスト デリゲートに結合してみませんか?

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

...
pd();
于 2008-10-31T22:16:01.060 に答える
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);
          }
     }
}
于 2008-10-31T23:31:28.270 に答える
7
public class MainClass
{
    static void Main()
    {
        pd[0]();
        pd[1]();
    }
}
于 2008-10-31T22:14:30.220 に答える
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");
        }
    }
}
于 2012-11-08T07:54:09.883 に答える
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());
        }


    }

}
于 2012-11-08T08:15:20.770 に答える