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