私自身の娯楽のために、そして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」を要求することによって何らかの形でアクセスされます
しかし、いくつかのことが私の頭に残っています、
1つ:この実装はMartin Fowlerのサービスロケーターパターンのようです。これは、物事を緊密に結合しすぎているため、可能であれば回避したいと思います。
2:PHPでプラグインのディスパッチャーを作成するのと同様のことを行いましたが、C#の型安全性により、このアプローチは困難です。
このような場合にMSのライブラリを使用できることはわかっていますが、後で書きたい他のことを支援するために、MSのライブラリを自分でゼロから構築して、途中で学ぶことができるようにしたいと思います。
とにかく、tl; dr:どういうわけかタイピングシステムを乗り越えて、これらのメソッドをどこかに保持できるようにしたいのですが、オブジェクトの配列をキャストする必要なしにそれらを呼び出すことができます。出来ますか?