28

在单声道中使用 .NET 2,我正在使用一个JSON返回嵌套字符串、对象字典和列表的基本库。

我正在编写一个映射器来将其映射到我已经拥有的 jsonData 类,并且我需要能够确定 an 的基础类型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;
    }
}

我正在使用的库是,litJsonJsonMapper该类本质上不适用于 iOS,因此我编写自己的映射器的原因。

4

4 回答 4

65

使用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<,>));
}
于 2013-06-19T11:39:20.243 回答
7

如果要检查某个对象是否属于某种类型,请使用is运算符。例如:

private static bool IsDictionary(object o)
{
    return o is Dictionary<string, object>;
}

尽管对于这么简单的事情,您可能不需要单独的方法,只需is在需要的地方直接使用运算符即可。

于 2013-06-19T11:59:51.350 回答
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<>));
}
于 2015-03-02T13:31:52.913 回答
2

如果您只需要检测对象是否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);
于 2017-04-27T05:09:56.967 回答