Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何一般性地为对象构建引用图_C#_Reflection - Fatal编程技术网

C# 如何一般性地为对象构建引用图

C# 如何一般性地为对象构建引用图,c#,reflection,C#,Reflection,我有一个场景,我需要递归地检查对象持有的所有引用(不管它是公共的还是私有的)。我需要检查的对象非常复杂,并且有许多不同的类型,因此如果可能的话,我更愿意以通用的方式编写它 类似这样的情况(只是一个示例,API并不重要): 它不需要处理循环引用。事实上,如果它在循环引用上爆炸,那就好了,因为这就是我试图检测的。我猜一些聪明的反射可以做到这一点,但我对反射不是很有经验。有什么想法吗?我脑子里刚想出来,我会像这样实施它。首先,创建一个表示对象图中一个对象的节点类,如下所示: internal seal

我有一个场景,我需要递归地检查对象持有的所有引用(不管它是公共的还是私有的)。我需要检查的对象非常复杂,并且有许多不同的类型,因此如果可能的话,我更愿意以通用的方式编写它

类似这样的情况(只是一个示例,API并不重要):


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

我脑子里刚想出来,我会像这样实施它。首先,创建一个表示对象图中一个对象的节点类,如下所示:

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)
    {
        ...
    }
}
内部密封类节点
{
私有只读对象_实例;
私有只读列表\u referencedInstances;
私有静态只读字典_节点=新字典();
公共静态节点CreateGraph(对象实例)
{
...
}
私有静态IEnumerable FindReferenceof(对象实例)
{
...
}
}
如果需要,可以使用字典存储所有创建的节点并检查循环引用。(这就像使用飞重模式)

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

FindReferences方法必须使用反射来搜索以下实例类型的所有FieldInfo对象:

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

希望您能为此做些什么。

有什么工具可以帮助您吗?这是一个程序集检查器,可以直观地显示程序集中的所有引用。可能与此重复:您是指对象引用还是类型引用?反射被设计为返回类型信息,而不是对象信息。但是,它可以透露私人成员的信息;另一方面,我不清楚您是想要类型还是数据(或者,可能两者都想要)。如果您想在对象树中查找对象引用,则不一定需要反射。@MikeHofer我对在复杂引用图中查找循环引用非常感兴趣。例如,A引用B引用C引用A,其中A是相同的类型和实例。B和C可以是任何类型。我不在乎值类型,因为它们不会导致循环引用。@Schwarzie2478我试图找到运行时循环引用,即相同的类型和相同的实例。我认为这个工具可以从脱机程序集生成图形,对吗?
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)
    {
        ...
    }
}