• ベストアンサー

C#でListとDictionaryの判別方法

C# 2010 version 4.0を使用しています。 例えばaという変数があったとして aがList<(この中の方はなんでも)>型なのか Dictionary<(この中の方はなんでも), (この中の方はなんでも)>型なのか 判別する方法はどのように記述すれば良いのでしょうか? if (aがList型の場合) { } else if (aがDictionary型の場合) { }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

aからオープンジェネリック型のTypeを取得して,それがリストであるかを比較する,というような形になります。 if (a == null) { // a は null } else { var type = a.GetType(); if (!type.IsGenericType) { // a はジェネリック型ではない == List<T>でもDictionary<TK, TV>でもない } else { var openType = type.GetGenericTypeDefinition(); if (openType == typeof(List<>)) { // a はList<T> } else if (openType == typeof(Dictionary<, >)) { // a はDictionary<TK, TV> } else { // a はその他のジェネリック型 } } }

takagoo100
質問者

お礼

ご回答ありがとうございます。 詳しく書いて頂きありがとうございます。 理想とする結果がでました。 ただすいません、自分の中でもう一つ疑問がでてきまして 例えば if (openType == typeof(Dictionary<, >)) でDictionaryを判別したあとにDictionary<, >の「<,>」の中がどんな型であろうとも ループ処理をさせたいのですが、 if (openType == typeof(Dictionary<,>)) { foreach (var kvp in a as Dictionary<dynamic, dynamic>/*←これが取得できない・・・*/) { } } dynamicだと無理なようなのですが、これはどのように記述したら 列挙(ループ)可能な処理ができるようになるのでしょうか? 自分としてはDictionaryの<,>の中の型の調べ方すら分からないのですが、 もしお分かりであればアドバイス頂けないでしょうか?

その他の回答 (3)

回答No.4

.NETのジェネリックは型を保持するため,コンパイル時に型が決定している必要があります。 今回の場合,aをDictionary<dynamic, dynamic>に変換するのではなく,a自体をdynamicに変換してください。 No.3のお礼部分への例だと, foreach (var kvp in (dynamic)a) { // kvp.Key / kvp.Valueを使う } という形になります。 コード上,全部dynamicなので,インテリセンスが使えなかったり速度の問題が出たりしますが……。

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、aそのものをdynamicに変換するんでね。 理想とする結果が得られました。 ありがとうございます。

回答No.2

List<string> a = new List<string>(); if (a.GetType() == typeof(List<string>)) {  Console.WriteLine("同一型"); } else {  Console.WriteLine("違う型"); }

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、typeofを使えばいいんですね。 ありがとうございます。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

正しいかはイマイチ自信ありませんが…… if (a.GetType().Name.IndexOf("List") != -1) {  // List型 } else if (a.GetType().Name.IndexOf("Dictionary") != -1) {  // Dictionary型 } とかでしょうか?

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、たしかにこれでもできますね。 ありがとうございます。

関連するQ&A