2011-07-06 23 views
2

型の比較に関して興味深い問題があります。私は何かが私のテスト中にコレクションの任意の並べ替え明示的な型と明示的な型の比較 - C#

var obField = value.GetType().InvokeMember(_stCollectionField, 
           System.Reflection.BindingFlags.GetProperty, 
           null, value, null); 

if (obField.GetType() != typeof(IEnumerable<object>)) 
{ 
    return true; 
} 

であれば、私はobFieldは、オブジェクトのコレクションであることが判明することを保証することができますテストするために、明示的な型との暗黙の種類を比較しようとしています。しかし、私はそれは常にその代わり、私はそれはそれをスキップしたいチェックやreturn true、内部で実行されることを発見しています(2種類が等しいbecasue。)

少しデバッグがobject {System.Collections.Generic.List<System.DateTime>}として私obFieldの種類を提供します。

どのようにしてそのタイプにマッチすることができますか?

おかげ

+1

'それは明らかタイプの'のIEnumerableない 'obField'は型である'一覧場合 '...あなたの質問は何でしたか? –

+0

リストはIEnumerable を拡張しますか? – AndyBursh

+1

@Andy:真ですが、 "=="は "から拡張可能"を意味するわけではなく、 "is * equal * to"を意味します(同じことが "!="のために保持されます)。 'List 'と 'IEnumerable 'は* equal *ではないので、 "!="は真と評価されます。 – Heinzi

答えて

3

使用Type.IsAssignableFrom、ここで使用される:例えばGetting all types that implement an interface

if (typeof(IEnumerable<object>).IsAssignableFrom(obField.GetType())) { ... } 
+1

追加:これは.NET 4でのみ動作します。なぜなら、インタフェースの共分散は以前は利用できなかったからです。 –

+0

魅力のように動作します、ありがとう! – AndyBursh

+0

@Andy:あらゆる種類のコレクションをテストしたい場合は、非ジェネリックな 'IEnumerable'インターフェースと比較する方が良いでしょう。 – LukeH

関連する問題