1

说我有这两个课

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实例找到所有嵌套的类实例。只关心类而不是字符串等。

需要是通用的,这样如果 Inner 有一个类它仍然可以工作。此外,如果有一个List<>IEnumerable一个类,它也需要找到它们。

干杯。

4

3 回答 3

2

使用反射将是要走的路。这是一个简单的代码片段,可以让您获取类的属性,如果属性不是值类型,则递归调用自身。显然,如果您想要 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));
            }
        }
    }
}
于 2009-05-01T12:06:23.533 回答
2

如果您的示例中的代码是这样的,您的问题将起作用:

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; }
}
于 2009-05-01T12:15:35.990 回答
-1

您想通过反射递归循环对象图

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

于 2009-05-01T12:03:15.723 回答