問題をできるだけ簡単に説明するために、実装している限り、任意の数の具象クラスを処理できる汎用プーリング システムを実装しようとしていますIBaseComponent
。
したがって、プールを管理するクラスには、プールのディクショナリがあります。
Dictionary<Type, Pool<IBaseComponent>> pools;
これにより、実装するクラスIBaseComponent
(いわば非常に「低レベル」のインターフェイスです。したがって、実装するクラスはそれほど互換性がありません) を必要なだけ作成できます。それぞれのプール。
今、私が直面している問題はIBaseComponent
、プールへの の最初のロード、いわばテンプレートとして機能することです。
このテンプレート オブジェクトは、コードではなく XML から読み込まれるため、実際のクラスはコンパイル時になく、実行時にしかありません (XML 定義で定義され、リフレクションを介して正式な型を取得します)。ご存知のように、ジェネリックはコンパイル時の安全性に依存していることを除けば、それはすべてうまくいきます。
したがって、いくつかの反射トリックを使用して、次のようにします。
var type = typeof(MyChildComponent);
var genericType = typeof(Pool<>);
var specificType = genericType.MakeGenericType(type);
var pool = Activator.CreateInstance(specificType );
pools.Add(T, pool as Pool<IBaseComponent>);
いくつかのクラスを想定:
public class MyChildComponent : IBaseComponent
問題は、プール ディクショナリに追加しているときに、最初のブロックの最後の行で発生します。インスタンス化されたプールのキャストがPool<IBaseComponent>
失敗し、null がディクショナリに挿入されます。
素晴らしい人々への私の質問はこれです:これを回避する合理的な方法はありますか? 可能な方法はありますか?
プールの少なくとも最初のテンプレート オブジェクトに対して、プールを使用できる可能性のあるそれぞれの具象クラスに対して、何らかの外部メソッド (XML、TXT など) を介して要素をロードする必要がある場合、アクセスできるのはクラスの最上位インターフェイスと正式な Type (両方とも外部定義ファイルで定義) について、ここで何かできることはありますか?
それとも、これはまったく不可能ですか?