Массив делегатов - PullRequest
       13

Массив делегатов

9 голосов
/ 01 ноября 2008

Я экспериментирую с вызовом функций делегата из массива делегатов. Мне удалось создать массив делегатов, но как мне вызвать делегата?

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 [], а не имя массива (делегаты).

Ответы [ 5 ]

14 голосов
/ 01 ноября 2008

Если они все одного типа, почему бы не объединить их в один многоадресный делегат?

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

...
pd();
7 голосов
/ 01 ноября 2008

В .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);
          }
     }
}
7 голосов
/ 01 ноября 2008
public class MainClass
{
    static void Main()
    {
        pd[0]();
        pd[1]();
    }
}
3 голосов
/ 08 ноября 2012
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 голосов
/ 08 ноября 2012
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());
        }


    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...