为了我自己的乐趣和学习 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;博士:我想以某种方式超越打字系统并能够将这些方法保存在某个地方,但仍然能够调用它们而无需诉诸于强制转换对象数组。可能吗?