2016-04-05 2 views
4

Я пытался обработать общий класс со свойствами List<T>. Однако при проверке свойства это не работает, используя IsAssignableFrom.check Если тип - это список, возвращает false

Код сниппета:

var type = model.GetType(); 

var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
int colorIndex = 0; 

foreach (var property in properties) 
{ 
    if (typeof(List<>).IsAssignableFrom(property.PropertyType)) 
    { 
     //codes here 

    } 
} 

ли я что-то пропустил? Почему он не рассматривает свойство как Список, даже если это список?

+0

Я не думаю, что вы можете использовать открытый общий тип таким образом ... В зависимости от вас фактическая проверка необходимости на 'IList' может быть достаточной или проверить построенный тип. –

ответ

7

В объекте model у вас есть объекты определенного типа, например List<string>, List<int> или что-то в этом роде. Я ваш код, однако, вы тестируете открытый родовой тип. Эти типы не совпадают, поэтому вы не получите соответствие в заявлении if. Чтобы исправить это, вы должны использовать функцию GetGenericTypeDefinition(), чтобы получить базовый открытый обобщенный тип:

foreach (var property in properties) 
{ 
    if (property.PropertyType.IsGenericType && 
     typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) 
    { 
     //codes here 

    } 
} 
3

Вы можете попробовать проверить, если элемент реализует IList так сделать проверку против «договора», а не конкретного класса:

if (typeof(IList).IsAssignableFrom(property.PropertyType) 
{ 

} 
+1

Спасибо, отправлено с моего телефона, так что я быстро потрудился. Сделано обновление! – Hypnobrew

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