繁体   English   中英

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

[英]How can I implement hooks using reflection in C#?

为了我自己的娱乐和学习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”以某种方式访问​​该钩子

但是,有几件事仍然困扰着我,

一:此实现似乎是马丁·福勒(Martin Fowler)的服务定位器模式,我认为该模式将事情紧密地结合在一起,如果可能的话,宁愿避免使用。

第二:虽然我做了一些类似的事情来为PHP中的插件创建调度程序,但是C#中的类型安全性使这种方法变得困难。

我知道我可以使用MS的库来做这种事情,但是我想自己重新构建它,这样我就可以在以后帮助我做其他事情的基础上学习它。

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

是。 您要尝试做的是几年前我们做插件的方式,而且效果还不错。 如今,我们有MEF来做,但是为了学习,我建议您看一下: http : //www.codeproject.com/Articles/6334/Plug-ins-in-C

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM