2010-10-18 2 views
0

EDIT: Похоже, что это не простой способ сделать это. Учитывая размер структуры класса, подход foreach представляется самым простым (и, вероятно, лучшим) способом достижения моей цели. Я оставляю вопрос открытым, если у кого-то есть блестящая идея. :)Рекурсивно просмотреть свойства определенного типа


Привет всем,

У меня есть список классов со структурой, подобной этой:

class A 
{ 
    ... 
} 

class B 
{ 
    ... 

    public List<A> ListOfA {...} 
} 

class C 
{ 
    ... 

    public List<A> ListOfA {...} 
    public List<B> ListOfB {...} 
} 

class D 
{ 
    ... 

    public List<A> ListOfA {...} 
    public List<B> ListOfB {...} 
    public List<C> ListOfC {...} 
} 

[...] 

Мне нужно создать метод в внешнепризматической наиболее класса (D в этом случае), что будет иметь следующий вид:

public IEnumerable<A> GetListOfA(); 

было бы рекурсивно (выход) возвращать список Insta nces of A, содержащихся в экземпляре D.

Текущая реализация представляет собой список жестко запрограммированных foreach. Я бы хотел сделать нечто более гибким, динамически просматривая свойства каждого класса и подкласса.

Чтобы предоставить вам более подробную информацию, структура класса создается из отчета XML FxCop. Сообщения FxCop могут быть связаны с пространством имен, модулем, типом, членом и т. Д. XML десериализуется в эту структуру классов, и сообщения могут быть найдены на разных уровнях структуры.

То, что я хочу достичь, на самом деле эквивалентно XPath //A над структурой класса.

У вас есть идея о том, как реализовать такой метод?

Большое спасибо за вашу помощь

+2

В вашей отображаемой иерархии нет иерархии ... Это просто куча инкапсулирующих типов. – leppie

+0

Просто реализуйте 'GetListOfA' во всех классах, которые должны это делать. например. в D вы будете называть регулярные 'GetListOfA' и' foreach GetListOfA' во всех списках участников. –

+0

В ООП нет иерархии классов. но он один с точки зрения данных, хотя это не очевидно из-за глупых имен классов. Спасибо за ваш комментарий, я обновлю теги –

ответ

1

Вы можете использовать отражение, чтобы проверить, существует ли метод или свойство определенного типа (Type.GetMethods ...) или если существует метод с определенным типом возвращаемого значения.

+0

Я думаю, что ваш подход прав, после некоторых мыслей и нескольких тестов я закончил тем, что оставил пучок foreach, как сейчас. Рекурсивное отражение было бы слишком сложным, без каких-либо преимуществ. Я ожидал, что пропустил явно простой способ сделать это. спасибо –

0

Я думаю, что вы не должны пытаться, если вы хотите достичь этой способности я предлагаю вам сохранить коллекцию всех А-х в D, который будет наблюдать за всеми вами дочерних элементов , и ребенок будет наблюдать за своими детьми и так далее.

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