【问题标题】:How can I implement hooks using reflection in C#?如何在 C# 中使用反射实现挂钩?
【发布时间】:2025-12-04 07:15:02
【问题描述】:

为了我自己的娱乐和学习 C# 反射 API,我一直在玩弄一个完全由插件构建的无用应用程序的想法,这样主程序所做的唯一事情就是读取配置文件,并加载一个插件,该插件将继续加载它配置为动态加载的所有其他程序集。

为此,我正在考虑使用属性来定义 (...)services(?) 和事件(为了论证,我们称它们为 ServiceAttribute(string) EventAttribute(string),其中参数是钩子的名称),然后保留一张我们可以在哪里找到这些的表格。一个例子是这样的

namespace example{
  public class Plugin : IPlugin{
    [Service("myService")]
    public void PrintFrickingEverything(params string[] toPrint){
      foreach(string s in toPrint){
        Console.WriteLine(s);
      }
    }
  }
}

通过询问“example.Plugin.myService”可以以某种方式访问​​该钩子

然而,有几件事在我脑海中挥之不去,

one:这个实现似乎是 Martin Fowler 的服务定位器模式,我认为它把事情耦合得太紧了,如果可能的话宁愿避免它。

二:虽然我在 PHP 中为插件创建调度程序,但 C# 中的类型安全性使这种方法变得困难。

我知道我可以使用 MS 的库来做这类事情,但我想自己从头开始构建它,这样我就可以一路了解它,以帮助我以后写其他东西。

无论如何,tl;dr:我想以某种方式超越打字系统并能够将这些方法保存在某个地方,但仍然能够调用它们而无需诉诸于强制转换对象数组。有可能吗?

【问题讨论】:

    标签: c# .net plugins architecture


    【解决方案1】:

    是的。 您正在尝试做的是我们几年前做插件的方式,并且效果很好。现在我们有 MEF 来做这件事,但是为了学习我建议看看这个:http://www.codeproject.com/Articles/6334/Plug-ins-in-C

    【讨论】:

    • 嗯,我实际上是在这个和消息传递风格系统之间折腾。我会去两个,看看会发生什么。谢谢!