我有一个场景,我需要递归检查一个对象持有的所有引用(无论它是公共的还是私有的)。我需要检查的对象非常复杂,并且有许多不同的类型,所以如果可能的话,我更喜欢一般地写它。
像这样的东西(只是一个例子,API并不重要):
var myObject = new MyObject();
var graph = GetGraph(myObject);
foreach (var reference in graph.References)
{
foreach (var subreference in reference.References)
{
// etc.
}
}
它不需要处理循环引用。事实上,如果它在一个圆形参考上爆炸就好了,因为这是我试图检测的。我猜测一些聪明的反思可以做到这一点,但我&#39 ;我对反思不是很有经验。有什么想法吗?
答案 0 :(得分:1)
在我的头脑中,我实现了这样的事情。首先,创建一个Node类,它表示对象图的一个对象,如下所示:
internal sealed class Node
{
private readonly object _instance;
private readonly List<Node> _referencedInstances;
private static readonly Dictionary<object, Node> _Nodes = new Dictionary<object, Node>();
public static Node CreateGraph(object instance)
{
...
}
private static IEnumerable<object> FindReferencesOf(object instance)
{
...
}
}
如果您愿意,可以使用Dictionary来存储所有已创建的节点并检查循环引用。 (这就像使用飞重模式一样)。
可以递归调用CreateGraph(对象实例)来构建整个图形,但如果对象图形变大,则可能需要避免递归。
FindReferences方法必须使用反射来搜索实例类型的所有FieldInfo对象:
希望你能用这个做点什么。