【发布时间】:2021-01-04 21:21:41
【问题描述】:
假设我有以下对象图
Parent : BaseEntity
string1 SimpleString
Middle Middle
List<Child> Children (3)
Middle : BaseEntity
string NormalStr
int NiceInt
RandomClass Ignore
Child : BaseEntity
string ChildString
Parent Parent
在此示例中,我想要一种方法将我的 Parent 作为输入并返回一个平面列表 {Parent, Middle, Child1, Child2, Child3}。它应该适用于任何类型的对象图。
我试图通过反射和递归到达那里。我遇到的问题是 Parent 和 Child 之间的循环引用,我最终陷入了无限循环。
如何防止这种情况发生?我似乎无法让任何“已经见过”的机制发挥作用。
这是我到目前为止得到的。它可以在没有收集部分的情况下工作,但该部分非常重要......
public void TraverseThroughProperties(object myObject)
{
foreach (var prop in myObject.GetType().GetProperties())
{
var instance = prop.GetValue(myObject);
if (instance is BaseEntity myBase)
TraverseThroughProperties(instance);
if (instance is ICollection collection)
{
foreach (var item in collection.OfType<BaseEntity>())
TraverseThroughProperties(item);
}
// Do something with myObject + prop
}
}
【问题讨论】:
-
从你的对象中不清楚你需要递归的地方。您的 BaseEntity 类是否提供了一些抽象接口,允许您将这些类视为图形?唯一引用层次结构中其他类的实例是 Parent,展平单个父级将相当简单,根本不需要递归。
标签: c# recursion reflection