人気ブログランキング | 話題のタグを見る
(.Net)objectがList<T>かまたは配列かどうか判定する
配列変数やジェネリックコレクション(List)をobjectにしてしまった時に、Listか配列か判定する方法です。



配列かどうかを判断にするにはオブジェクトの GetType().IsArray で可能なようです。
型指定なしのジェネリックコレクション(List<>)かどうかを判定するには、typeof(List<>).IsAssignableFrom(オブジェクト.GetType().GetGenericTypeDefinition()) とするといいようです。(ただし、配列の変数にこれをすると例外が発生するので、配列じゃないことを確認した後に動かす必要があります)
型指定ありのジェネリックコレクション(List)かどうかを判定するには、typeof(List).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が配列型かどうか判定する方法について 大変役に立つスレでした。ほぼコピペさせてもらってます。
by jehoshaphat | 2011-08-12 12:20 | .Net開発


<< (.Net)List<s... WindowsPCのIPアドレ... >>