Я экспериментирую с вызовом функций делегата из массива делегатов. Мне удалось создать массив делегатов, но как мне вызвать делегата?
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 [], а не имя массива (делегатов).





public class MainClass
{
static void Main()
{
pd[0]();
pd[1]();
}
}
Почему бы вам не объединить les PD вместе!
Если все они одного типа, почему бы просто не объединить их в один многоадресный делегат?
static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;
...
pd();
Одна из причин не делать этого - индивидуально обрабатывать исключения, создаваемые любым из делегатов, а не просто перехватывать первое.
Согласно моему редактированию, делегаты не выполняются в ответ на событие, а вызываются индивидуально с использованием индекса в массиве.
@jacob_c - да, если вы действительно хотите :) @ pro3carp3 - в этом случае вам просто нужно получить к нему доступ по индексу, как обычно для массива. Нет ничего особенного в том, чтобы быть здесь делегатом.
Спасибо, Джон. Я сделал глупую ошибку и подумал, что чего-то не хватает.
В .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);
}
}
}
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");
}
}
}
Это «делегат», а не «делегаты»
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());
}
}
}
Технически это должен быть MyClass.pd [0] (). pd - это тип, а MyClass.pd - статический член MyClass.