).IsAssignableFrom(オブジェクト.GetType()) とするといいようです。
下記にサンプルコードを載せてみました。(C#)
//List<T>コレクション
object lstStr = new List<string>() {"aaa","bbb","ccc","ddd" };
object lstInt = new List<int>() { 1, 2, 3 };
//配列
object aryStr = new string[] { "aaa", "bbb", "ccc", "ddd" };
object aryInt = new int[] { 1, 2, 3 };
//List<> かどうかチェック
if (typeof(List<>).IsAssignableFrom(lstStr.GetType().GetGenericTypeDefinition()))
Console.WriteLine(" lstStrはList<>である");
else
Console.WriteLine(" lstStrはList<>でない");
//List<T>かどうかチェック
if (typeof(List<string>).IsAssignableFrom(lstStr.GetType()))
Console.WriteLine(" lstStrはList<string>である");
else
Console.WriteLine( " lstStrはList<string>でない");
if (typeof(List<int>).IsAssignableFrom(lstInt.GetType()))
Console.WriteLine( " lstIntはList<int>である");
else
Console.WriteLine( " lstIntはList<int>でない");
if (typeof(List<string>).IsAssignableFrom(aryStr.GetType()))
Console.WriteLine( " aryStrはList<string>である");
else
Console.WriteLine( " aryStrはList<string>でない");
if (typeof(List<int>).IsAssignableFrom(aryInt.GetType()))
Console.WriteLine( " aryIntはList<int>である");
else
Console.WriteLine( " aryIntはList<int>でない");
//配列かどうかチェック Type.IsArrayプロパティで判定
if (lstStr.GetType().IsArray)
Console.WriteLine( " lstStrは配列である");
else
Console.WriteLine( " lstStrは配列でない");
if (lstInt.GetType().IsArray)
Console.WriteLine(" lstIntは配列である");
else
Console.WriteLine( " lstIntは配列でない");
if (aryStr.GetType().IsArray)
Console.WriteLine( " aryStrは配列である");
else
Console.WriteLine( " aryStrは配列でない");
if (aryInt.GetType().IsArray)
Console.WriteLine( " aryIntは配列である");
else
Console.WriteLine( " aryIntは配列でない");
結果はこうなります。
lstStrはList<>である
lstStrはListである
lstIntはListである
aryStrはListでない
aryIntはListでない
lstStrは配列でない
lstIntは配列でない
aryStrは配列である
aryIntは配列である
Type.IsAssignableFrom というメソッドで型が同じかどうか判断できるようです。(厳密には同じではなくても継承可能な階層内、実装されたインターフェイス等でもtrueになるようです。)
あんまり object になんでもかんでも代入することは無いのですが、今回は動的にオブジェクトのメンバを取得し、その中にコレクション型のメンバがいたのでこのような判定が必要になりました。
参考:
@IT 会議室:objectが配列型かどうか判定する方法について 大変役に立つスレでした。ほぼコピペさせてもらってます。