检查对象是否是字典或列表

时间:2013-06-19 11:37:56

标签: c# json generics mono

使用单声道的.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,因此我正在编写自己的映射器。

4 个答案:

答案 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