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

标签 c# reflection attributes reflection.emit

我们使用 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 之前,我需要能够在运行时向方法添加属性。

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

最佳答案

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

  1. 定义一个抽象类 AbstractEventDebugger,使用方法 Search 搜索所有 event 成员,并将它们注册到 EventInspector。此外,定义一个方法 IdentifyEvent,让您能够识别调用它的事件(这取决于您 - 将包含哪些参数等)。
  2. 使用TypeBuilder(如here 所述)定义一个继承自您的类的动态类型。此类将是您的 调试器 对象的类。
  3. 使用 Reflection.Emit.MethodBuilder(参见 here)将处理程序附加到您的类,这将从父类调用 IdentifyEvent 方法,并且,
  4. Reflection.Emit 使用 CustomAttributeBuilder 类的处理程序的属性(参见 here )。
  5. 创建您的 dynamic 类的实例并将其发送到 EventInspector。
  6. 启动它:)

Here是关于如何创建调用某物的方法的示例(实际上它是经典的“Hello world”)。

你需要做很多调整才能把它做好,但你会学到很多关于反射的知识。

祝你好运!

关于c# - 如何在运行时向方法添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268426/

相关文章:

c# - 使用基类列表中的项目到泛型方法

c# - 通过 Monogame 内容管道加载 XML 文件?

java 。用于创建对象实例的字符串内容

具有已知事件签名的 C# 2.0 动态事件订阅

PHP 对象 : get value of attribute by computed name

javascript - 将 C# 变量传递给 jsrender 模板中的辅助函数

c# - 在 DataGrid 中修剪文本时的自动工具提示

java - 使用反射创建对象及其声明字段的 JTree

c# - 为什么 Nullable<T> 不是有效的自定义属性参数,而 T 是?

c# - 什么时候必须使用 DebuggerDisplay 属性?使用这个有什么好处?