質問: Reflection または Microsoft.Cci を使用して、
から派生した型に含まれる型を確実に判別する静的な方法はありますか?CollectionBase
背景:
私は、型をコピーし、それらの型のカスタマイズされたバージョンを作成し、それらの間のコンバーターを作成するコード ジェネレーターに取り組んでいます。Microsoft.Cci を介してソース アセンブリ内の型を調べます。テキスト テンプレートを使用してソース コードを出力します。多くの変換とカスタマイズを行い、私が気にしないコードを放り出します。
結果のコードでは、 、、または以前に使用されList<T>
たすべての場所を置き換えるつもりです。追加の作業なしでシリアル化できると確信しているため 、使用したいと思います。これは、アプリケーションにとって重要です。あらゆる場合において具体的です。カスタム実装をコピーする必要があるため、クラスをコピーしないようにしています。コード ジェネレーターでそれを行う必要はありません。CollectionBase
IEnumerable<T>
T[]
List<T>
T
CollectionBase
私が問題を抱えている唯一の部分は、カスタムを交換するときの決定T
です。List<T>
CollectionBase
これまでに行ったこと:
MSDN のドキュメントと のサンプルを簡単に調べたところ、派生型でCollectionBase
カスタム メソッドを作成することが言及されています。Add
これは決して強制されているとは思わないので、それに頼ることができるかどうかはわかりません. 実装者は別の名前を付けたり、さらに悪いことに、Object
唯一の共通の祖先として複数の型をサポートするコレクションを持っている可能性があります。
私が検討した代替案:
おそらく、デフォルトのシリアライゼーションは、私が利用できるいくつかのトリックを行います。コレクションのデフォルトのシリアライゼーションはありますCollectionBase
か、それとも通常は自分で実装する必要がありますか? 自分でやらなければならない場合、型を判断するために調べることができる信頼できるメタデータはありますか? デフォルトのシリアル化をサポートしている場合、コレクション内のアイテムのランタイム タイプに依存していますか?
コード ジェネレーターでCollectionBase
、対応するT
forにマップされた既知の型のマッピングを作成できList<T>
ます。見つかった特定のCollectionBase
型がリストにない場合は、例外をスローします。信頼できる代替手段がない場合は、おそらくこれを使用します。