mardi 24 février 2015

Checking if type or instance impliments IEnumerable regardless of type T [duplicate]


I'm doing a heavy bit of reflection in my current project, and I'm trying to provide a few helper methods just to keep everything tidy.


I'd like to provide a pair of methods to determine if a type or instance implements IEnumerable - regardless of the type T. Here is what I have at the moment:



public static bool IsEnumerable(this Type type)
{
return (type is IEnumerable);
}

public static bool IsEnumerable(this object obj)
{
return (obj as IEnumerable != null);
}


When I test them using:



Debug.WriteLine("Type IEnumerable: " + typeof(IEnumerable).IsEnumerable());
Debug.WriteLine("Type IEnumerable<>: " + typeof(IEnumerable<string>).IsEnumerable());
Debug.WriteLine("Type List: " + typeof(List<string>).IsEnumerable());
Debug.WriteLine("Type string: " + typeof(string).IsEnumerable());
Debug.WriteLine("Type DateTime: " + typeof(DateTime).IsEnumerable());
Debug.WriteLine("Instance List: " + new List<string>().IsEnumerable());
Debug.WriteLine("Instance string: " + "".IsEnumerable());
Debug.WriteLine("Instance DateTime: " + new DateTime().IsEnumerable());


I get this as the result:



Type IEnumerable: False
Type IEnumerable<>: False
Type List: False
Type string: False
Type DateTime: False
Instance List: True
Instance string: True
Instance DateTime: False


The type method doesn't appear to work at all - I had expected a true for the direct System.Collections.IEnumerable match at least.


I'm aware that string is technically enumerable, albeit with a few caveats. Ideally in this case however I'd need the helper method to return false for it. I just need the instances with a defined IEnumerable<T> type to return true.


I've probably just missed something fairly obvious - can anyone point me in the right direction?






Aucun commentaire:

Enregistrer un commentaire