Если вы просто добавляете вызов, это действительно просто - вам не нужно извлекать всех подписанных делегатов или что-то в этом роде;просто подпишитесь с отражением:
var type = GetType();
// Note the small change here to make the filter slightly simpler
var events = type.GetEvents()
.Where(e => e.IsDefined(typeof(ExecuteAttribute), false));
foreach (var e in events)
{
// "handler" is the event handler you want to add
e.AddEventHandler(this, handler);
}
Теперь я сделал предположение о том, что вы хотите сделать, а именно - вызывайте свой метод один раз каждый раз, когда возникает событие.Это не то же самое, что вызов вашего метода один раз каждый раз, когда вызывается обработчик события , что и сделал бы ваш исходный код.Это намного сложнее ... но вам это действительно нужно?
(Если бы вы могли дать больше информации о большей цели, это действительно помогло бы.)
Обратите внимание, что код, который я здесь предоставил, должен работать независимо от того, как реализовано событие - он не полагается на то, что он является полевым событием.
РЕДАКТИРОВАТЬ: Хорошо,полный пример, показывающий, как вы можете добавить простой EventHandler
делегат к любому событию, которое соответствует нормальному шаблону событий:
using System;
using System.Reflection;
class CustomEventArgs : EventArgs {}
delegate void CustomEventHandler(object sender, CustomEventArgs e);
class Publisher
{
public event EventHandler PlainEvent;
public event EventHandler<CustomEventArgs> GenericEvent;
public event CustomEventHandler CustomEvent;
public void RaiseEvents()
{
PlainEvent(this, new EventArgs());
GenericEvent(this, new CustomEventArgs());
CustomEvent(this, new CustomEventArgs());
}
}
class Test
{
static void Main()
{
Publisher p = new Publisher();
Type type = typeof(Publisher);
foreach (EventInfo eventInfo in type.GetEvents())
{
string name = eventInfo.Name;
EventHandler handler = (s, args) => ReportEvent(name, s, args);
// Make a delegate of exactly the right type
Delegate realHandler = Delegate.CreateDelegate(
eventInfo.EventHandlerType, handler.Target, handler.Method);
eventInfo.AddEventHandler(p, realHandler);
}
p.RaiseEvents();
}
static void ReportEvent(string name, object sender, EventArgs args)
{
Console.WriteLine("Event {0} name raised with args type {1}",
name, args.GetType());
}
}
Обратите внимание, как мы должны построить точный тип требуемого делегата - но мы знаем, что мыэто можно сделать с помощью совместимого метода, при условии, что все соответствует нормальному шаблону событий.