2015-12-11 2 views
0

Я хочу вызвать общий метод «get_» для каждого свойства, IEnumerable<class>, моего класса модели просмотра, чтобы избежать создания длинных операторов switch, которые явно получают каждый список ... Кто-нибудь знать, как получить тип и метод объекта в целом?отражение для вызова методов неизвестных типов свойств

foreach (var prop in vm.GetType().GetProperties().Where(x => x.GetCustomAttributes<ExportAttribute>().Any())) 
    { 
     var objType = ??; 
     var method = objType.GetMethod(<by name>); 
     var list = method.Invoke(prop, null); 
     foreach (var item in list) 
     { 
      //do something 
     } 
    } 
+0

'вар ObjType = prop.PropertyType' – Rob

+1

Пока не ясно, что вы здесь - почему бы просто не использовать 'PropertyInfo.GetGetMethod()'? –

ответ

4

Я хотел бы использовать что-то вроде:

foreach (var prop in vm.GetType() 
         .GetProperties() 
         .Where(x => x.GetCustomAttributes<ExportAttribute>().Any())) 
{ 
    var list = (IEnumerable) prop.GetValue(vm, null); 
    foreach (var item in list) 
    { 
     // do something 
    } 
} 

Теперь item наберется, как object ... но вы не можете сделать лучше, чем это в любом случае. В любом случае код «сделать что-то» не может использовать никаких элементов типа элемента, потому что это может быть любой тип.

Если, с другой стороны, вы знаете, что каждое свойство будет что-то реализации IEnumerable<T> где T будет в каждом случае имеют общий базовый тип, то в силу общей ковариантности IEnumerable<T> введенного в .NET 4, вы можете написать :

foreach (var prop in vm.GetType() 
         .GetProperties() 
         .Where(x => x.GetCustomAttributes<ExportAttribute>().Any())) 
{ 
    var list = (IEnumerable<BaseType>) prop.GetValue(vm, null); 
    foreach (var item in list) 
    { 
     // do something 
    } 
} 

Тогда вы можете получить доступ к item.PropertyDeclaredInBaseType.

Обратите внимание, что я изменил цель вызова к vm вместо null, так как предположительно вы хотите, чтобы эти экземпляра свойства ...

+0

Почему я могу видеть свойства элемента в часах, когда я устанавливаю точку останова, но не могу получить к ним доступ? Думаю, я не понимаю, почему это может быть любой тип? Что делать, если все свойства, которые я выполняю, имеют один и тот же базовый тип? Я просто хочу получить доступ к базовому типу ... он показывает тип как объект {blah.blah.blah}, дающий полное имя класса ??? – midohioboarder

+0

@midohioboarder: тогда вы должны использовать 'IEnumerable ' вместо этого, предполагая, что вы используете .NET 4. Вы, к сожалению, ничего не говорили об этом в вопросе. –

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