私はリフレクションに頭を悩ませようとしているので、私が書いているプログラムにプラグイン機能を追加することにしました。概念を理解する唯一の方法は、指を動かしてコードを書くことです。そのため、IPlugin および IHost インターフェイスで構成される単純なインターフェイス ライブラリ、IPlugin を実装するクラスのプラグイン実装ライブラリ、および単純なプラグイン オブジェクトで簡単な作業を行う IHost 実装クラスをインスタンス化するコンソール プロジェクト。
リフレクションを使用して、プラグイン実装 dll 内に含まれる型を繰り返し処理し、型のインスタンスを作成したいと考えました。このコードでクラスを正常にインスタンス化できましたが、作成したオブジェクトをインターフェイスにキャストできませんでした。
このコードを試してみましたが、期待どおりにオブジェクト o をキャストできませんでした。デバッガーを使用してプロセスをステップ実行すると、適切なコンストラクターが呼び出されました。オブジェクト o をクイックウォッチすると、実装クラスで期待していたフィールドとプロパティが含まれていることがわかりました。
loop through assemblies
loop through types in assembly
// Filter out unwanted types
if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
continue;
// This successfully created the right object
object o = Activator.CreateInstance(type);
// This threw an Invalid Cast Exception or returned null for an "as" cast
// even though the object implemented IPlugin
IPlugin i = (IPlugin) o;
これでコードが機能するようにしました。
using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();
ここに私の質問があります:
- Activator.CreateInstance(Type t) はオブジェクトを返しますが、オブジェクトが実装するインターフェイスにオブジェクトをキャストできませんでした。なんで?
- CreateInstance() の別のオーバーロードを使用する必要がありましたか?
- リフレクションに関連するヒントとコツは何ですか?
- 私が得ていない反射の重要な部分はありますか?