web-dev-qa-db-ja.com

オブジェクトが辞書かリストかを確認

モノで.NET 2を使用して、ネストされた文字列、オブジェクトディクショナリ、リストを返す基本的なJSONライブラリを使用しています。

これを既に持っているjsonDataクラスにマップするマッパーを書いており、objectの基になる型がディクショナリかリストかを判別できるようにする必要があります。以下は私がこのテストを実行するために使用している方法ですが、よりきれいな方法があるかどうか疑問に思っていましたか?

private static bool IsDictionary(object o) {
    try {
        Dictionary<string, object> dict = (Dictionary<string, object>)o;
        return true;
    } catch {
        return false;
    }
}

private static bool IsList(object o) {
    try {
        List<object> list = (List<object>)o;
        return true;
    } catch {
        return false;
    }
}

私が使用しているライブラリはlitJsonですが、JsonMapperクラスは基本的にiOSでは機能しないため、独自のマッパーを作成しているのです。

16
user1711383

isキーワードとリフレクションを使用します。

public bool IsList(object o)
{
    if(o == null) return false;
    return o is IList &&
           o.GetType().IsGenericType &&
           o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));
}

public bool IsDictionary(object o)
{
    if(o == null) return false;
    return o is IDictionary &&
           o.GetType().IsGenericType &&
           o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<,>));
}
42
Dustin Kingen

特定のオブジェクトが何らかのタイプであることを確認したい場合は、is演算子を使用します。例えば:

private static bool IsDictionary(object o)
{
    return o is Dictionary<string, object>;
}

これほど単純なものの場合は、おそらく別のメソッドは必要ありませんが、必要な場所で直接is演算子を使用するだけです。

4
svick

上記の答えを変更します。 GetGenericTypeDefinition()を使用するには、メソッドの前にGetType()を付ける必要があります。 MSDNを見ると、これがGetGenericTypeDefinition()にアクセスする方法です。

public virtual Type GetGenericTypeDefinition()

これがリンクです: https://msdn.Microsoft.com/en-us/library/system.type.getgenerictypedefinition(v = vs.110).aspx

public bool IsList(object o)
{
    return o is IList &&
       o.GetType().IsGenericType &&
       o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));
}

public bool IsDictionary(object o)
{
    return o is IDictionary &&
       o.GetType().IsGenericType &&
       o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<>));
}
3
TheMiddleMan

オブジェクトが_List/Dictionary_かどうかだけを検出する必要がある場合は、myObject.GetType().IsGenericType && myObject is IEnumerableを使用できます

ここにいくつかの例があります:

_var lst = new List<string>();
var dic = new Dictionary<int, int>();
string s = "Hello!";
object obj1 = new { Id = 10 };
object obj2 = null;

// True
Console.Write(lst.GetType().IsGenericType && lst is IEnumerable);
// True
Console.Write(dic.GetType().IsGenericType && dic is IEnumerable);
// False
Console.Write(s.GetType().IsGenericType && s is IEnumerable);
// False
Console.Write(obj1.GetType().IsGenericType && obj1 is IEnumerable);
// NullReferenceException: Object reference not set to an instance of 
// an object, so you need to check for null cases too
Console.Write(obj2.GetType().IsGenericType && obj2 is IEnumerable);
_
0
Mehdi Dehghani