Вложенные классы и рекурсия - PullRequest
1 голос
/ 01 мая 2009

Скажите, у меня есть эти два класса

public class Container
{
    public string name { get; set; }
    public Inner Inner { get; set; }
}

public class Inner
{
    public string text { get; set; }
    public Inner2 Innert2 { get; set; }
}

public class Inner2 {}

Как мне поступить, учитывая, что экземпляр класса Container находит все вложенные экземпляры класса. Только действительно заботятся о классах, а не о строках и т. Д.

Нужно быть универсальным, чтобы, если бы у Иннера был класс, он все равно работал. Также, если есть List<> или IEnumerable класса, он должен найти их тоже.

Приветствие.

Ответы [ 3 ]

2 голосов
/ 01 мая 2009

Использование Reflection было бы способом. Вот простой фрагмент кода, который позволит вам получить свойства класса и, если свойство не относится к типу значения, рекурсивно вызывает себя. Очевидно, что если вам нужно определенное поведение с членами Enums или IEnumerable, вам нужно добавить это.

public void FindClasses(object o)
{
    if (o != null)
    {
        Type t = o.GetType();
        foreach(PropertyInfo pi in t.GetProperties())
        {
            if(!pi.PropertyType.IsValueType)
            {
                // property is of a type that is not a value type (like int, double, etc).
                FindClasses(pi.GetValue(o, null));
            }
        }
    }
}
1 голос
/ 01 мая 2009

Ваш вопрос будет работать, если код в вашем примере будет таким:

public class Container
{
    public string name { get; set; }
    public Inner Inner { get; set; }
}

public class Inner
{
    public string text { get; set; }
    public List<Inner> MoreInners { get; set; }
}

В этом случае вы можете использовать внешний класс итератора для выполнения работы или встроить рекурсию непосредственно в класс Container. Я сделаю последнее:

public class Container
{
    public string name { get; set; }
    public Inner Inner { get; set; }

    public List<Inner> SelectAllInner()
    {
        List<Inner> list = new List<Inner>();
        SelectAllInner(Inner, list);
        return list;
    }

    private void SelectAllInner(Inner inner, List<Inner> list)
    {
        list.Add(inner);
        foreach(Inner inner in MoreInners)
            SelectAllInner(inner, list);
    }
}

public class Inner
{
    public string text { get; set; }
    public List<Inner> MoreInners { get; set; }
}
0 голосов
/ 01 мая 2009

Вы хотите перебрать цикл объекта с помощью Reflection

http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...