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