如何一般地为对象构建参考图

时间:2014-09-29 14:15:42

标签: c# reflection

我有一个场景,我需要递归检查一个对象持有的所有引用(无论它是公共的还是私有的)。我需要检查的对象非常复杂,并且有许多不同的类型,所以如果可能的话,我更喜欢一般地写它。

像这样的东西(只是一个例子,API并不重要):

var myObject = new MyObject();
var graph = GetGraph(myObject);
foreach (var reference in graph.References)
{
    foreach (var subreference in reference.References)
    {
        // etc.
    }
}

它不需要处理循环引用。事实上,如果它在一个圆形参考上爆炸就好了,因为这是我试图检测的。我猜测一些聪明的反思可以做到这一点,但我&#39 ;我对反思不是很有经验。有什么想法吗?

1 个答案:

答案 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对象:

  • 公共或非公开
  • 引用类型的
  • 而不是值类型(我推测)

希望你能用这个做点什么。