2010-11-07 3 views

ответ

37

Проверить typeof(IEnumerable).IsAssignableFrom(type).

Каждый тип сбора, включая массивы и IEnumerable<T>, реализует IEnumerable.

+12

Спасибо - я должен был исключить 'string', потому что придумал как массив' Char', и я не хочу этого. :) –

+0

Да; Я забыл об этом. – SLaks

+0

Также исключает System.Xml.XmlText, а также другие потомки System.Xml.XmlNode. –

-4

Простой. Проще всего сделать, заключается в следующем:

IList<T> listTest = null; 

try{ 
    listTest = ((IList<T>)yourObject); 
} 
catch(Exception listException) 
{ 
    //your object doesn't support IList and is not of type List<T> 
} 

IEnumerable<T> enumerableTest = null; 

try{ 
    enumerableTest = ((IEnumerable<T>)yourObject); 
} 
catch(Exception enumerableException) 
{ 
    //your object doesn't suport IEnumerable<T>; 
} 

================================== ================

Вы также можете попробовать это, которое не включает несколько блоков try/catch. Лучше, если вы можете избежать их использования, потому что каждое условие на самом деле оценивается средой выполнения во время выполнения ... это плохой код (хотя иногда нет никакого способа обойти это).

Type t = yourObject.GetType(); 

if(t is typeof(List<OjbectType>)) //object type is string, decimal, whatever... 
{ 
    // t is of type List<ObjectType>... 
} 
else if(t is typeof(IEnumerable<ObjectType>) 
{ 
    // t is of type IEnumerable<ObjectType>... 
} 
else 
{ 
    // t is some other type. 
    // use reflection to find it. 
} 
+2

Вместо того, чтобы делать 'listTest = ((IList ) yourObject);' и поймать исключение, вы можете просто сделать 'yourObject is IList ' – Gabe

+2

Ничего себе, что за беспорядок. Здесь, по крайней мере, четыре вещи плохо. (1) Исключение исключений вместо использования 'is' или' as'. (2) Захват 'Exception' вместо' InvalidCastException'. (3) Во втором блоке кода мышление C# 'is' работает так же, как VB6' Is' - фактически '==' является правильным оператором, но он все равно будет терпеть неудачу, потому что (4) 'GetType()' always возвращает конкретный класс, никогда не имеющий интерфейса, например 'IEnumerable ' –

0
if (objType.IsArray || objType.IsGenericType) 
{ 

} 
+1

'objType.IsGenericType' возвращает' true', если это 'int?' и 'Nullable ' не является 'IEnumerable' или' Array' –

+0

@MatthiasBurger Я протестировал его, он вернул false –

+0

@AlaMusleh Он возвращает True для int? –

Смежные вопросы