Подтвердить что ты не робот

Проверьте, является ли объект словарем или списком

Работа с .NET 2 в моно, я использую базовую библиотеку JSON, которая возвращает вложенную строку, объект Словарь и списки.

Я пишу mapper, чтобы сопоставить это с классом 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, поэтому я пишу свой собственный обработчик.

4b9b3361

Ответ 1

Используйте ключевое слово 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<,>));
}

Ответ 2

Если вы хотите проверить, что определенный объект имеет какой-то тип, используйте оператор is. Например:

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

Хотя для чего-то такого простого, вам, вероятно, не нужен отдельный метод, просто используйте оператор is, где он вам нужен.

Ответ 3

Изменение приведенного выше ответа. Чтобы использовать 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<>));
}

Ответ 4

Если вам просто нужно определить объект 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);