以防万一有人觉得它有用,我正在分享我从usr和Henk 的答案中编写的递归方法,它解决了我的问题:
static void EnumerateObjectsInRange(object root, HashSet<object> hashset)
{
if (root == null || hashset.Contains(root))
{
return;
}
hashset.Add(root);
FieldInfo[] fields = root.GetType().GetFields(BindingFlags.Static
| BindingFlags.Instance
| BindingFlags.Public
| BindingFlags.NonPublic);
foreach (FieldInfo field in fields)
{
object obj = field.GetValue(root);
if (obj == null)
{
continue;
}
if (obj.GetType().IsSubclassOf(typeof(Array)))
{
foreach (object member in (Array)obj)
{
EnumerateObjectsInRange(member, hashset);
}
}
EnumerateObjectsInRange(obj, hashset);
}
}
这个方法仍然需要一些重构(并且它不检查 HashSet 是否为空),但它完成了工作。
要调用它,请提供根对象和将存储访问对象的空 HashSet。