Динамическая (массовая) проверка событий на подписку. Возможно ли? - C#
Формулировка задачи:
Доброго времени суток. Возникла необходимость каким-то образом массово проверить события на наличие подписантов и вот уже день маюсь с ней...
У меня в классе 15 событий (и это, скорее всего, не предел), и я хочу сформировать список только из тех, которые подписаны (чтобы вызывать только по списку).
Можно, конечно, скопипастить для каждого конструкцию n-раз:
Но дело сие неблагодарное, я считаю... К тому же, у меня конструкция немного сложнее: в словарь записывается не само событие, а метод его вызывающий, так что при изменении делегата метода (в процессе работы понял, что параметров недостаточно), пришлось изменять и кучу методов, и кучу строк-проверок...
В результате захотел сделать чего-то подобное:
НО в EventInfo нет фактически самого Eventa (как я это понимаю). В результате кропотливого сравнения, никаких различий между EventInfo подписанного эвента и не подписанного я не нашёл. Что сравнивать с null'ем не пойму. В поиске подобных вопросов не нахожу... Такое ощущение, что вопрос решается как-то просто и по-другому...
Да и студия в момент выполнения точно знает, что метод подписан:
Так каким же образом выудить эту информацию? Или можно каким-то другим способом проверить динамически все события класса на подписку?
Заранее благодарю.
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 нету, для наглядности :) }
Решение задачи: «Динамическая (массовая) проверка событий на подписку. Возможно ли?»
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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д