2014-09-29 2 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

+0

가능한 복제본 : http://stackoverflow.com/questions/1443548/printing-full-object-graph-using-c-sharp-and-reflection – Mrchief

+0

개체 참조 또는 참조 형식을 의미합니까? 리플렉션은 객체 정보가 아닌 유형 정보를 반환하도록 설계되었습니다. 그러나 개인 회원에 대한 정보를 공개 할 수는 있습니다. 반면에 유형이나 데이터 (또는 둘 모두 가능)를 원한다면 명확하지 않습니다. 객체 참조를 찾는 객체 트리를 걷고 싶다면 반드시 반영 할 필요는 없습니다. –

답변

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-방법은 인스턴스 유형의 모든의 fieldInfo - 개체를 검색하기 위해 반사를 사용해야합니다 :

  • 공용 또는 참조 형식의
  • 비공개가 아닌 값 유형 (나는 추정한다)

당신은 이것으로 무엇인가 할 수 있기를 바란다.

관련 문제