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
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<,>));
}
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.
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);
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<>));
}