2014-09-29 20 views
0

我有一个场景,我需要递归检查由对象持有的所有引用(不管它是公有还是私有)。我需要检查的对象非常复杂,并且有很多不同的类型,所以如果可能的话,我宁愿一般地写它。如何为对象一般构建参考图形

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

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

它并不需要处理循环引用。事实上,如果它在循环引用上爆炸,那就好了,因为这正是我想要检测的。我猜想一些聪明的反射可以做到这一点,但我对反射不是很有经验。有任何想法吗?

+0

你能帮助一个工具吗? http://www.amberfish.net/download.aspx这是一个组件检查器,可以直观地显示程序集中的所有引用。 – Schwarzie2478 2014-09-29 14:20:38

+0

这可能是重复的:http://stackoverflow.com/questions/1443548/printing-full-object-graph-using-c-sharp-and-reflection – Mrchief 2014-09-29 14:24:54

+0

你的意思是对象引用或类型引用?反射旨在返回类型信息,而不是对象信息。但是,它可以显示有关私人成员的信息;另一方面,我不清楚你是否想要类型或数据(或可能是两者)。如果你想走一个对象树来寻找对象引用,你不一定需要反射。 – 2014-09-29 14:55:05

回答

1

就在我头顶,我会实现这样的事情。首先,创建一个节点类代表对象的图形化的一个对象,像这样:

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) 
    { 
     ... 
    } 
} 

的字典可以用来存储所有创建的节点,并检查循环引用,如果你想。 (这就像使用飞重模式)。

可以递归调用CreateGraph(对象实例)来构建整个图形,但是如果对象图变大,您可能希望避免递归。

的FindReferences-方法将必须使用反射来搜索实例类型的是所有字段信息的对象:

  • 公共或非公开引用类型的
  • 而不是一个值类型(我猜)

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