2012-06-02 31 views
25

実行時の型が何らかのコレクション型であるかどうかを調べようとしています。私が下にあるものは動作しますが、私が行ったような配列のコレクション型と思われる型の名前を付ける必要があるのは奇妙です。タイプがコレクションのタイプであるかどうかを判断する方法は?

以下のコードでは、一般的なロジックの理由は、私のアプリケーションでは、すべてのコレクションが汎用であると考えているからです。

bool IsCollectionType(Type type) 
{ 
    if (!type.GetGenericArguments().Any()) 
     return false; 

    Type genericTypeDefinition = type.GetGenericTypeDefinition(); 
    var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) }; 
    return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition)); 
} 

このコードをどのようにしてよりスマートに簡単にすることができますか?

+0

ことの一つは、あなたが通常 ''それはIEnumerableを 'を実装していても、' char'sのコレクションとしてSTRING'検討する必要がないということです。 – svick

答えて

48

これらすべてのタイプは、実際にはIEnumerableを継承しています。あなたはそれをチェックすることができます:

bool IsEnumerableType(Type type) 
{ 
    return (type.GetInterface(nameof(IEnumerable)) != null); 
} 

またはあなたが本当にいるICollectionをチェックする必要がある場合: "構文" の部分で

bool IsCollectionType(Type type) 
{ 
    return (type.GetInterface(nameof(ICollection)) != null); 
} 

ルック:

+0

ハハ。それは本当に簡単でした。何らかの理由で、私はそれがうまくいかないと思って、私はそれを試しませんでした。 –

+1

ドキュメント内の継承階層は、実装されたインターフェイスを教えてくれません。しかし、構文セクションを見てください。 – svick

+0

@svick:何 に関するパブリッククラス一覧:IListの、ICollectionを、 \t IEnumerableを、IListの、ICollectionを、IEnumerableを ? – Ruben

2

あなたはタイプがオープンジェネリックインターフェイスを実装しているかどうかを確認するために、このヘルパーメソッドを使用することができます。あなたのケースでは、DoesTypeSupportInterface(type, typeof(Collection<>))

public static bool DoesTypeSupportInterface(Type type,Type inter) 
{ 
    if(inter.IsAssignableFrom(type)) 
     return true; 
    if(type.GetInterfaces().Any(i=>i. IsGenericType && i.GetGenericTypeDefinition()==inter)) 
     return true; 
    return false; 
} 

を使用するか、単に非ジェネリックIEnumerableを確認することができます。すべてのコレクションインターフェイスは、それを継承します。しかし、私はIEnumerableコレクションを実装している型を呼び出すことはありません。

+0

またはジェネリックインターフェイスに加えてジェネリックタイプにも対応するソリューション(ここにあります)(http://stackoverflow.com/a/1075059/122781)を使用してください。 – HappyNomad

1

それらのすべてits thereをチェックすることが十分になければならないことを意味してIEnumerableを()、継承IEnumerable

+3

それで、偽陽性につながる文字列 – War

0

あなたは、LINQを使用し、これは値を持っている場合

yourobject.GetType().GetInterfaces().Where(s => s.Name == "IEnumerable") 

のようなインタフェース名を検索することができますがのインスタンスである:

+3

偽陽性につながる文字列 – War

2

このスレッドは古いですが、Microsoft isキーワードに基づいて2015年7月20日現在の最新の例があります。心に留めておくべき

if(collection is ICollection) return true; 
+0

質問は*型*がオブジェクトインスタンスではなくコレクションであるかどうかを判断する方法です。 –

関連する問題