3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)objectがList<T>かまたは配列かどうか判定する

配列変数やジェネリックコレクション(List)をobjectにしてしまった時に、Listか配列か判定する方法です。

配列かどうかを判断にするにはオブジェクトの GetType().IsArray で可能なようです。

型指定なしのジェネリックコレクション(List<>)かどうかを判定するには、typeof(List<>).IsAssignableFrom(オブジェクト.GetType().GetGenericTypeDefinition()) とするといいようです。(ただし、配列の変数にこれをすると例外が発生するので、配列じゃないことを確認した後に動かす必要があります)

型指定ありのジェネリックコレクション(List)かどうかを判定するには、typeof(List).IsAssignableFrom(オブジェクト.GetType()) とするといいようです。

下記にサンプルコードを載せてみました。(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が配列型かどうか判定する方法について 大変役に立つスレでした。ほぼコピペさせてもらってます。