.NET反射:查找使用的类型

Ran*_*y K 5 .net c# reflection

我一直在努力解决这个问题.我试图做的是在我正在处理的一些代码中构建一个关于如何使用对象的"映射".将其视为增强的查找用法.显示这个的最简单方法是通过示例:

public class MasterClass
{
    Type1 type1;
    Type2 type2;
    Type3 type3;
    void InitializeData()
    {
        type1 = new Type1(this);
        type2 = new Type2(this);
        type3 = new Type3(this);
    }
}

public class Type1
{
    private MasterClass _master;
    public Type1(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type2 and _master.type3 here
    }
}

public class Type2
{
    private MasterClass _master;
    public Type2(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type3 here
    }
}

public class Type3
{
    private MasterClass _master;
    public Type3(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type1 and _master.type2 here
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是获取一个映射或报告,在示例中,将给出类似的内容:

Type1使用者:{Type3}

Type2使用者:{Type1,Type3}

Type3使用者:{Type1,Type2}

如果我能把它写进字典,那我就回家了.:-)

我尝试过的:

我试过遍历程序集,每种类型,每种方法然后拉动IL阵列,然后试图解析操作数没有运气.我甚至尝试使用一些正则表达式来查看源文件,但我有几千个类可以使用,用几种不同的样式编写,这意味着我会错过一些引用.

我可以使用Reflector &&/|| Resharper一次只能获得一个参考,但我想立刻得到它们.

有什么建议?

use*_*116 7

我建议使用NDepend,因为它是根据你描述的问题量身定做的.在代码中执行此操作将是相当多的工作.


Gab*_*ams 3

这并不容易。对于以下所有内容,您必须获取 MethodInfo、PropertyInfo、FieldInfo 等的实例:

  • 方法
  • 类型
  • 属性(获取和设置)
  • 事件(添加和删除)

然后,您需要解析 IL 并在正在检查的类型所在的 Module 实例上调用 ResolveMethod 实例,并查看该实例是否与您尝试确定使用的方法的 MethodInfo 相对应。

编辑:

就像 Visual Studio 中的“查找所有引用”一样,这只会查找直接引用。如果您还想查找间接引用(例如:method1 引用 method2,method2 引用 method3 - 您希望看到 method1 到 method3 之间存在连接),则需要使用递归来完成此操作。