Динамическая (массовая) проверка событий на подписку. Возможно ли? - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Возникла необходимость каким-то образом массово проверить события на наличие подписантов и вот уже день маюсь с ней... У меня в классе 15 событий (и это, скорее всего, не предел), и я хочу сформировать список только из тех, которые подписаны (чтобы вызывать только по списку). Можно, конечно, скопипастить для каждого конструкцию n-раз:
if(SomeEvent != null) 
   RealEventsList.Add(SomeEvent)
Но дело сие неблагодарное, я считаю... К тому же, у меня конструкция немного сложнее: в словарь записывается не само событие, а метод его вызывающий, так что при изменении делегата метода (в процессе работы понял, что параметров недостаточно), пришлось изменять и кучу методов, и кучу строк-проверок... В результате захотел сделать чего-то подобное:
EventInfo[] eiArray = this.GetType().GetEvents();
 
foreach(EventInfo eInfo in eiArray)
{
   if(eInfo.RiseEvent != null)
      RealEventsList.Add(eInfo.CurrentEvent); //CurrentEvent нету, для наглядности :)
}
НО в EventInfo нет фактически самого Eventa (как я это понимаю). В результате кропотливого сравнения, никаких различий между EventInfo подписанного эвента и не подписанного я не нашёл. Что сравнивать с null'ем не пойму. В поиске подобных вопросов не нахожу... Такое ощущение, что вопрос решается как-то просто и по-другому...
Да и студия в момент выполнения точно знает, что метод подписан:
Так каким же образом выудить эту информацию? Или можно каким-то другим способом проверить динамически все события класса на подписку? Заранее благодарю.

Решение задачи: «Динамическая (массовая) проверка событий на подписку. Возможно ли?»

textual
Листинг программы
public class MyClass
{
    public delegate void MyDelegate();
    public event MyDelegate MyEvent;
 
    public MyClass()
    {
        MyEvent += new MyDelegate(A);
        MyEvent += new MyDelegate(B);
    }
    public void A() { }
    public void B() { }
}
 
 
static void Main(string[] args)
{
    MyClass mc = new MyClass();
 
    foreach (EventInfo ev in mc.GetType().GetEvents())
    {
        FieldInfo fi = mc.GetType().GetField(
            ev.Name,
            BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);
 
        Delegate del = (Delegate)fi.GetValue(mc);
        var list = del.GetInvocationList();
        foreach (var d in list)
        {
            Console.WriteLine("{0}", d.Method.Name);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы