如何在运行时向方法添加属性

本文关键字:方法 添加 属性 运行时 | 更新日期: 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 之前,我需要能够在运行时向方法添加属性。

如何在运行时向方法添加属性?

如何在运行时向方法添加属性

您要实现的目标非常复杂,因此我将尝试提供一些东西来帮助您入门。这是我认为你需要结合才能实现的目标:

  1. 定义一个抽象类AbstractEventDebugger ,使用一个方法Search搜索所有event成员,并将它们注册到事件检查器。此外,定义一个方法IdentifyEvent,允许您识别调用它的事件(这取决于您 - 将具有哪些参数等(。
  2. 使用 TypeBuilder(如此处所述(定义从类继承的dynamic type。此类将是debugger对象的类。
  3. 使用 Reflection.Emit.MethodBuilder(请参阅此处(将处理程序附加到您的类,它将从父类调用 IdentifyEvent 方法,并且,
  4. 使用类Reflection.Emit处理程序的属性CustomAttributeBuilder(请参阅此处(。
  5. 创建 dynamic 类的实例并将其发送到事件检查器。
  6. 点燃它:)

下面是一个关于如何创建一个调用某物的方法的示例(实际上它是经典的"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