如何在C#中使用反射实现钩子?

时间:2013-01-25 05:38:15

标签: c# .net plugins architecture

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

为此,我考虑使用属性来定义(...)服务(?)和事件(为了参数,我们称之为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”

以某种方式访问​​钩子

然而,有几件事情在我脑海中浮现,

一:这个实现似乎是Martin Fowler的服务定位器模式,我认为它将事物紧密地结合在一起,并且如果可能的话宁愿避免它。

二:虽然我已经做过类似的事情来为PHP中的插件制作调度程序,但C#中的类型安全性使这种方法变得困难。

我知道我可以使用MS的库来做这种事情,但是我想自己从头开始构建这个,所以我可以一路上学习它以帮助我稍后想要写的其他东西。

无论如何,tl; dr:我想以某种方式通过打字系统并且能够将这些方法保留在某个地方,但仍然可以调用它们而无需求助于投射对象数组。有可能吗?

1 个答案:

答案 0 :(得分:1)

YES。 你想要做的是多年前我们做插件的方式,它运作正常。现在我们有MEF去做,但要了解我推荐看看这个:http://www.codeproject.com/Articles/6334/Plug-ins-in-C