Динамическая (массовая) проверка событий на подписку. Возможно ли? - 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);
}
}
}