などのコレクションを検出するためにリフレクションを使用しようとしていますList<T>
。最終的には、利用可能なインスタンスなしで (つまり、typeof のみを介して) 操作する必要があり、単に を超えるコレクションを検出したいと考えてList<T>
いますが、簡単にするために、失敗する基本的なテスト ケースを次に示します。
Type type = (new List<string>()).GetType();
if (type.IsAssignableFrom(typeof(System.Collections.IEnumerable)))
{
Console.WriteLine("True.");
}
else Console.WriteLine("False.");
私も試しIList
てみICollection
ましたが、役に立ちませんでした。
トラブルシューティング中に、次の議論に遭遇しました: List<int> は IEnumerable<ValueType> ではないのはなぜですか?
その議論のOPは、共分散が機能しないため、値の型は上記のようなものでは検出されないという彼の答えを見つけました。ただし、参照型である文字列を使用していますが、共分散はまだ見られません。(とにかく私にとって) もっと興味深いのは、上記の説明のサンプル コードを実行すると、非常に異なる結果が表示されることです。
System.Collections.Generic.List`1[AssignableListTest.Program+X] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[System.String] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[AssignableListTest.Program+Z] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[System.Int32] is most likely a list of ValueTypes or a string
blah is most likely a list of ValueTypes or a string
1 is not a list
そのポスターとは構成に違いがあるに違いないと私は信じています。私は Visual Studio 2005 を使用しており、この場合は .NET 3.5 を使用していますが、可能であれば 2.0 への互換性が必要です。実際、ポスターが持っていた結果を得ることができればそれで十分です(それIEnumerable
が実装されていることを識別します)が、「is」の代わりに使用するType.IsAssignableFrom()
と、すべて「is not a list」となります。