代码之家  ›  专栏  ›  技术社区  ›  Schotime

嵌套类和递归

  •  1
  • Schotime  · 技术社区  · 17 年前

    假设我有这两门课

    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 回复  |  直到 13 年前
        1
  •  2
  •   CMerat    17 年前

    使用反射将是可行的方法。下面是一个简单的代码片段,它允许您获取类的属性,如果属性不是值类型,则递归地调用它自己。显然,如果您想要使用enum或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));
                }
            }
        }
    }
    
        2
  •  1
  •   Nathan Ridley    17 年前

    如果你的代码中的问题是:

    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; }
    }
    

    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; }
    }