2014-09-29 21 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-方法將必須使用反射來搜索實例類型的是所有字段信息的對象:

  • 公共或非公開引用類型的
  • 而不是一個值類型(我猜)

希望你能用這個做點什麼。