说我有这两个班级
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
,它也需要找到它们。
干杯。
答案 0 :(得分: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));
}
}
}
}
答案 1 :(得分:1)
如果您的示例中的代码是这样的,那么您的问题就会起作用:
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; }
}
答案 2 :(得分:-1)
您希望使用Reflection
以递归方式遍历对象图http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx