2013-10-02 9 views
0

Как проверить, если объект, который я получить в качестве результата метода не ValueType и не IEnumerable<ValueType>?Проверьте IEnumerable имеют ValueType (во время выполнения)

Вот что я писал:

MethodInfo selectedOverload = SelectOverload(selectedMethodOverloads); 
object result = ExecuteAndShowResult(selectedOverload); 
ExploreResult(result); 

private static void ExploreResult(object result) 
{ 
if (result != null && 
    !(result is ValueType) && 
    !((IEnumerable)result).GetType().GetProperty("Item").PropertyType) is ValueType) 
    ) 
    Console.WriteLine("explore"); 
} 

К сожалению тип PropertyType является Type, его содержание типа мне нужно проверить (например, int), но я не знаю, как.

EDIT:

Хорошо, .IsValueType работал, но теперь я хочу также, чтобы исключить строки (которые не признаются как типы значений), так что?

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType is string) 

не работает!

EDIT 2:

Просто ответил себе:

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType == typeof(string)) 

Вопрос остается открытым о том, что если я хочу, чтобы проверить наследование от базового класса:

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType == typeof(BaseClass)) 

не работает, потому что TYPEOF проверяет тип выполнения, и если PropertyType == InheritedClassType вернет ложь ...

+2

Вы просто значит 'GetProperty («Item»). PropertyType.IsValueType'? –

+0

Тип.IsValueType? –

+0

Спасибо за ответы! Это то, что мне нужно. – Teejay

ответ

3

Использование Type.IsValueType:

private static void ExploreResult(object result) 
{ 
if (result != null && 
    !(result.GetType().IsValueType) && 
    !((IEnumerable)result).GetType().GetProperty("Item").PropertyType.IsValueType) 
    ) 
    Console.WriteLine("explore"); 
} 

Хотя если result не является типом значения, но не IEnumerable чем вы получите ошибку приведения. Эта проверка требует некоторой работы.

Ответ на вторую часть

!((IEnumerable)result).GetType().GetProperty("Item").PropertyType is string) 

всегда ложно, потому что PropertyType возвращает Type, который никогда не является строкой. Я думаю, что вы хотите

!(result.GetType().GetProperty("Item").PropertyType == typeof(string)) 

Обратите внимание, что я взял актерский к IEnumerable, поскольку вы ищете недвижимость через отражение в любом случае, так что бросок не имеет никакого отношения.

Ответ на третий редактировать

Я хочу, чтобы проверить наследство от BaseClass

Для этого вы хотите type.IsAssignableFrom():

Type itemType = result.GetType().GetProperty("Item").PropertyType; 
bool isInheritedFromBaseClass = 
    typeof(BaseClass).IsAssignableFrom(itemType); 
+0

О да, извините, в коде, который я написал здесь, я забыл 'if (result is IEnumerable)' part :) – Teejay

+0

Требуется больше работы, чем это - 'IEnumerable.Элемент определяется как «объект». Если вы хотите знать, является ли это «IEnumerable » и что 'T' является типом значений, вам нужно сделать некоторое отражение против параметра типового типа. –

+0

Нет, «Item» просто верните тип перечислителя, просто попробуйте. – Teejay

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