检查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上工作,因此我正在编写自己的映射器。

检查Object是Dictionary还是List

使用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];
}
相关文章: