We’re using Microsoft.Practices.CompositeUI.EventBroker to handle event subscription and publication in our application. The way that works is that you add an attribute to your event, specifying a topic name, like this:
[EventPublication('example', PublicationScope.Global)] public event EventHandler Example;
then you add another attribute to your handler, with the same topic name, like this:
[EventSubscription('example', ThreadOption.Publisher)] public void OnExample(object sender, EventArgs e) { ... }
Then you pass your objects to an EventInspector which matches everything up.
We need to debug this, so we’re trying to create a debug class that subscribes to all the events. I can get a list of all the topic names… but only at runtime. So I need to be able to add attributes to a method at runtime, before we pass our debug object to the EventInspector.
How do I add attributes to a method at runtime?
What you are trying to achieve is quite complicated, so I will try to provide something just to get you started. This is what I think you would need to combine in order to achieve something:
AbstractEventDebugger, with a methodSearchthat searches all of theeventmembers, and registers them with the EventInspector. Also, define a methodIdentifyEventthat will allow you to identify the event that has called it (this depends on you – what parameters will have, etc.).dynamic typeusingTypeBuilder(as described here), that inherits from your class. This class would be the class of yourdebuggerobject.Reflection.Emit.MethodBuilder(see here), which will be calling theIdentifyEventmethod from the parent class and,Reflection.Emitthe attributes on the handlers usingCustomAttributeBuilderclass (see here).dynamicclass and send it to the EventInspector.:)Here is a sample on how to create a method that calls something (Actually it’s the classic ‘Hello world’).
You will need to do a lot of tweaking in order to get it done well, but you will learn a lot about reflection.
Good luck!