使用单声道的.NET 2,我使用的是一个基本的JSON
库,它返回嵌套的字符串,对象字典和列表。
我正在编写一个mapper来将它映射到我已经拥有的jsonData类,我需要能够确定object
的基础类型是Dictionary还是List。下面是我用来执行此测试的方法,但是想知道这是否更清晰?
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,因此我正在编写自己的映射器。
答案 0 :(得分:35)
使用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<,>));
}
答案 1 :(得分:4)
如果要检查某个对象是否属于某种类型,请使用is
运算符。例如:
private static bool IsDictionary(object o)
{
return o is Dictionary<string, object>;
}
虽然对于这么简单的事情,您可能不需要单独的方法,只需在您需要的地方直接使用is
运算符。
答案 2 :(得分: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<>));
}
答案 3 :(得分:0)
如果您只是需要检测对象class Problem3Class{
public int countRepeated (int[] x){
return Arrays.stream(x).sum();
}
public int countRepeated2 (List<Integer> x){
return x.stream().reduce(0, (a, b) -> a+b);
}
}
,则可以使用List/Dictionary
以下是一些例子:
myObject.GetType().IsGenericType && myObject is IEnumerable