プロが教える店舗&オフィスのセキュリティ対策術

C# 2010 version 4.0を使用しています。

例えばaという変数があったとして
aがList<(この中の方はなんでも)>型なのか
Dictionary<(この中の方はなんでも), (この中の方はなんでも)>型なのか
判別する方法はどのように記述すれば良いのでしょうか?

if (aがList型の場合) {
}
else if (aがDictionary型の場合) {
}

A 回答 (4件)

.NETのジェネリックは型を保持するため,コンパイル時に型が決定している必要があります。


今回の場合,aをDictionary<dynamic, dynamic>に変換するのではなく,a自体をdynamicに変換してください。

No.3のお礼部分への例だと,
foreach (var kvp in (dynamic)a)
{
// kvp.Key / kvp.Valueを使う
}
という形になります。
コード上,全部dynamicなので,インテリセンスが使えなかったり速度の問題が出たりしますが……。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/16 21:33

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 はその他のジェネリック型
}
}
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
詳しく書いて頂きありがとうございます。
理想とする結果がでました。

ただすいません、自分の中でもう一つ疑問がでてきまして
例えば
if (openType == typeof(Dictionary<, >))
でDictionaryを判別したあとにDictionary<, >の「<,>」の中がどんな型であろうとも
ループ処理をさせたいのですが、

if (openType == typeof(Dictionary<,>))
{
foreach (var kvp in a as Dictionary<dynamic, dynamic>/*←これが取得できない・・・*/)
{

}
}

dynamicだと無理なようなのですが、これはどのように記述したら
列挙(ループ)可能な処理ができるようになるのでしょうか?
自分としてはDictionaryの<,>の中の型の調べ方すら分からないのですが、
もしお分かりであればアドバイス頂けないでしょうか?

お礼日時:2013/01/16 20:33

List<string> a = new List<string>();


if (a.GetType() == typeof(List<string>))
{
 Console.WriteLine("同一型");
}
else
{
 Console.WriteLine("違う型");
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/16 20:20

正しいかはイマイチ自信ありませんが……



if (a.GetType().Name.IndexOf("List") != -1) {
 // List型
}
else if (a.GetType().Name.IndexOf("Dictionary") != -1) {
 // Dictionary型
}

とかでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/16 20:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!