Вы можете сделать это через Reflection, но это менее чем очевидно. Если вы объявите событие в C #, в класс будет добавлено поле с именем события + «Событие». Если вы вызовете GetValue для поля, он вернет экземпляр MulticastDelegate.
Получив MulticastDelegate, вы можете получить список вызовов и вызвать каждого участника по очереди:
EventArgs e = new EventArgs(myClassInstance); // Create appropriate EventArgs
MulticastDelegate eventDelagate =
this.GetType().GetField(theEventName + "Event",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate;
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate del in delegates) {
del.Method.Invoke(del.Target, new object[] { myClassInstance, e });
}
Обратите внимание, что для этого необходимо получить поле NonPublic из экземпляра, поэтому оно будет работать только с полным доверием и очень ограничено.
Можно ли создать универсальный Raise (), который принимает событие, которое будет вызвано в качестве параметра? следовательно, он все равно будет вызываться из класса?
Да. Было бы довольно легко изменить приведенный выше код, чтобы сделать это. Просто замените «myClassInstance» этим. Это на самом деле также позволит правильно работать с полным доверием, поскольку NonPublic BindingFlag больше не будет проблемой.