wake-up-neo.com

Prüfen Sie, ob Objekt ein Verzeichnis oder eine Liste ist

Bei der Verwendung von .NET 2 in Mono verwende ich eine grundlegende JSON-Bibliothek, die verschachtelte Zeichenfolge, Objektverzeichnis und Listen zurückgibt.

Ich schreibe einen Mapper, um dies einer jsonData-Klasse zuzuordnen, die ich bereits habe, und ich muss feststellen können, ob der zugrunde liegende Typ einer object ein Wörterbuch oder eine Liste ist. Unten ist die Methode, die ich für diesen Test verwende, aber habe ich mich gefragt, ob es einen saubereren Weg gibt?

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;
    }
}

Die Bibliothek, die ich verwende, ist litJson, aber die JsonMapper-Klasse funktioniert im Wesentlichen nicht unter iOS. Daher schreibe ich meinen eigenen Mapper.

13
user1711383

Verwenden Sie das Schlüsselwort und die Reflektion 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<,>));
}
28
Romoku

Wenn Sie prüfen möchten, ob ein bestimmtes Objekt von einem bestimmten Typ ist, verwenden Sie den Operator is. Zum Beispiel:

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

Für etwas so einfaches benötigen Sie wahrscheinlich keine separate Methode. Verwenden Sie den Operator is direkt dort, wo Sie es benötigen.

3
svick

Ändern Sie die obige Antwort. Um GetGenericTypeDefinition() verwenden zu können, müssen Sie die Methode mit GetType() vorbereiten. Wenn Sie sich MSDN ansehen, wird auf GetGenericTypeDefinition() zugegriffen: 

public virtual Type GetGenericTypeDefinition()

Hier der Link: https://msdn.Microsoft.com/de-de/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<>));
}
2
TheMiddleMan

Wenn Sie nur feststellen müssen, ob das Objekt List/Dictionary ist oder nicht, können Sie myObject.GetType().IsGenericType && myObject is IEnumerable verwenden.

Hier ist ein Beispiel:

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