配列変数やジェネリックコレクション(List
配列かどうかを判断にするにはオブジェクトの GetType().IsArray で可能なようです。
型指定なしのジェネリックコレクション(List<>)かどうかを判定するには、typeof(List<>).IsAssignableFrom(オブジェクト.GetType().GetGenericTypeDefinition()) とするといいようです。(ただし、配列の変数にこれをすると例外が発生するので、配列じゃないことを確認した後に動かす必要があります)
型指定ありのジェネリックコレクション(List
下記にサンプルコードを載せてみました。(C#)
//List
コレクション object lstStr = new List
() {"aaa","bbb","ccc","ddd" }; object lstInt = new List
() { 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
かどうかチェック if (typeof(List
).IsAssignableFrom(lstStr.GetType())) Console.WriteLine(" lstStrはList
である" );else
Console.WriteLine( " lstStrはList
でない" );
if (typeof(List
).IsAssignableFrom(lstInt.GetType())) Console.WriteLine( " lstIntはList
である" );else
Console.WriteLine( " lstIntはList
でない" );
if (typeof(List
).IsAssignableFrom(aryStr.GetType())) Console.WriteLine( " aryStrはList
である" );else
Console.WriteLine( " aryStrはList
でない" );
if (typeof(List
).IsAssignableFrom(aryInt.GetType())) Console.WriteLine( " aryIntはList
である" );else
Console.WriteLine( " aryIntはList
でない" );
//配列かどうかチェック 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が配列型かどうか判定する方法について 大変役に立つスレでした。ほぼコピペさせてもらってます。