Исходя из вашего текущего сценария, т.е.
- Полеподобное событие.
- Поле делегата поддержки имеет то же имя, что и событие.
(this, EventArgs.Empty)
- допустимые аргументы для передачи делегату.
Вы можете сделать что-то вроде этого (требуется дополнительная проверка аргумента):
public void fireEvent(String eventName)
{
// Get a reference to the backing field
var del = (Delegate)typeof(EventHub)
.GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(this);
// Invoke the delegate, it's invocation-list will contain the listeners
if(del != null)
del.DynamicInvoke(this, EventArgs.Empty);
}
Использование:
var eHub = new EventHub();
eHub.SOME_EVENT += delegate { Console.WriteLine("SOME_EVENT fired.."); };
eHub.fireEvent("SOME_EVENT");
Теперь вы можете обобщить эту идею с помощью метода расширения на object
, если хотите, но все это действительно плохая идея. Эта проблема не может быть решена в общем случае, потому что никто не может знать, как событие «реализовано». Внутри методов add
и remove
может быть произвольный код, и логика «запуска» события также может быть чем угодно. Там может даже не быть поля резервной многоадресной рассылки для хранения слушателей.
В любом случае, попытка сказать объекту, что он запускает событие, почти всегда является признаком серьезного недостатка дизайна, ИМО. Если вы все еще действительно хотите этого, было бы намного лучше объявить такой метод в вашем классе:
public void RaiseXXXEvent() { ... }