Check if Object is Dictionary or List

后端 未结 4 1041
逝去的感伤
逝去的感伤 2020-12-30 01:02

Working with .NET 2 in mono, I\'m using a basic JSON library that returns nested string, object Dictionary and lists.

I\'m writing a mapper to map this

相关标签:
4条回答
  • 2020-12-30 01:49

    Use the is keyword and reflection.

    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<,>));
    }
    
    0 讨论(0)
  • 2020-12-30 02:00

    If you want to check that a certain object is of some type, use the is operator. For example:

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

    Though for something this simple, you probably don't need a separate method, just use the is operator directly where you need it.

    0 讨论(0)
  • 2020-12-30 02:01

    If you just need to detect the object is List/Dictionary or not, you can use myObject.GetType().IsGenericType && myObject is IEnumerable

    Here is some example:

    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);
    
    0 讨论(0)
  • 2020-12-30 02:07

    Modifying the above answer. In order to use GetGenericTypeDefinition() you must preface the method with GetType(). If you look at MSDN this is how GetGenericTypeDefinition() is accessed:

    public virtual Type GetGenericTypeDefinition()
    

    Here is the link: 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<>));
    }
    
    0 讨论(0)
提交回复
热议问题