如何在运行时向方法添加属性?
我们使用Microsoft.Practices.CompositeUI.EventBroker来处理我们的应用程序中的事件订阅和发布。 可行的方法是向事件添加属性,指定主题名称,如下所示:
[EventPublication("example", PublicationScope.Global)] public event EventHandler Example;
然后你用你的处理程序添加另一个属性,使用相同的主题名称,如下所示:
[EventSubscription("example", ThreadOption.Publisher)] public void OnExample(object sender, EventArgs e) { ... }
然后将对象传递给EventInspector,它匹配所有内容。
我们需要对此进行调试,因此我们尝试创建一个订阅所有事件的调试类。 我可以获得所有主题名称的列表……但仅限于运行时。 因此,在将调试对象传递给EventInspector之前,我需要能够在运行时向方法添加属性。
如何在运行时向方法添加属性?
你想要实现的是非常复杂的,所以我会尝试提供一些东西,以帮助你开始。 这是我认为你需要结合才能实现的目标:
- 使用搜索所有
event
成员的方法Search
定义抽象类AbstractEventDebugger
,并使用EventInspector注册它们。 另外,定义一个方法IdentifyEvent
,它允许您识别调用它的事件(这取决于您 – 具有哪些参数等)。 - 使用inheritance自您的类的
TypeBuilder
(如此处所述)定义dynamic type
。 该类将是debugger
对象的类。 - 使用
Reflection.Emit.MethodBuilder
(参见此处 )将Handler附加到您的类,它将从父类调用IdentifyEvent
方法,并且 -
Reflection.Emit
。使用CustomAttributeBuilder
类在处理程序上CustomAttributeBuilder
属性(参见此处 )。 - 创建
dynamic
类的实例并将其发送到EventInspector。 - 把它点起来
:)
这里有一个关于如何创建调用某个东西的方法的示例(实际上它是经典的“Hello world”)。
你需要做很多调整才能很好地完成它,但你会学到很多关于反思的知识。
祝好运!
属性是编译时function(除非您正在处理ComponentModel – 但我怀疑它正在使用reflection)。 因此,您无法在运行时添加属性。 这将是一个类似的问题“如何在运行时向类型添加额外的方法?”。 在常规的C#/ .NET(pre-DLR)中,你不能。
您需要深入研究DynamicMethod
的世界。 但是,当你需要了解MSIL时,我真的建议你仔细考虑你的架构。
EventInspector使用EventTopics(存储在WorkItem中)来完成所有繁重的工作。 每个EventTopic对象都可以访问一个名为的TraceSource
Microsoft.Practices.CompositeUI.EventBroker.EventTopic
您可以在app.config文件中启用,如下所示:
这应该会将大量有用的消息路由到Visual Studio中的调试窗口。 如果你想超越VS调试窗口,你有很多选择。 我建议查看以下文章:
使用TraceSource的代码检测我的Persoanl Vade Mecum