检查Object是Dictionary还是List
本文关键字:还是 List Dictionary Object 检查 | 更新日期: 2023-09-27 18:18:58
使用。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上工作,因此我正在编写自己的映射器。
使用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<,>));
}
如果要检查某个对象是否属于某种类型,请使用is
操作符。例如:
private static bool IsDictionary(object o)
{
return o is Dictionary<string, object>;
}
对于这么简单的事情,您可能不需要单独的方法,只需在需要的地方直接使用is
操作符
修改以上答案。为了使用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<>));
}
如果您只需要检测对象是否为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);
var t = obj.GetType();
if(t.IsGenericType && typeof(System.Collections.IList).IsAssignableFrom(t))
{
// it is of type list
// if its a list of integers for example then listOf will be of type int
var listOf = t.GenericTypeArguments[0];
}