【问题标题】:.NET Reflection: Find used types.NET 反射:查找使用的类型
【发布时间】:2009-12-29 17:04:31
【问题描述】:

我一直在努力解决这个问题。我正在尝试做的是在我正在处理的一些代码中构建对象如何使用的“地图”。将其视为增强的 Find Usages。展示这一点的最简单方法是通过示例:

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
    }
}

我想要做的是获得一个映射或报告,在示例的情况下,会给出如下内容:

Type1 使用者:{Type3}

Type2 使用者:{Type1, Type3}

Type3 使用者:{Type1, Type2}

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

我尝试过的:

我尝试过检查程序集、每种类型、每种方法,然后提取 IL 数组,然后尝试解析操作数,但没有成功。我什至尝试过使用一些正则表达式查看源文件,但我有数千个类要查看,它们以几种不同的风格编写,这意味着我会错过一些参考。

我可以使用反射器 &&/|| Resharper 一次获得一个参考,但我想一次获得所有参考。

有什么建议吗?

【问题讨论】:

  • 完成这项工作的反射器插件是否足够?
  • 您想以编程方式还是仅使用工具来实现这一目标?
  • C# 是一种编程语言。它没有反射。那是 .NET。
  • 我不在乎 :-) 如果有工具可以做到这一点,太好了!如果我必须自己动手,那就这样吧。
  • 看看 FXCop。这可以提供一些关于程序集的依赖信息。

标签: c# .net reflection


【解决方案1】:

我建议为此使用NDepend,因为它是针对您所描述的问题量身定制的。在代码中执行此操作将需要大量工作。

【讨论】:

  • 根据您的建议,我已经下载了 NDepend 的踪迹并使用了它,但我还没有找到生成所需报告的方法。我可能还得再玩一会儿。
  • 依赖矩阵不适合您的需求?还是只是没有详细介绍您需要的细节?
  • 在一个命名空间中有数百个类,并且对兄弟命名空间中的对象的引用,矩阵和图形都不是很有用。我必须处理的较小命名空间之一会生成一个 640 x 640 的矩阵。要包含所有对象,我将查看一个 4300+ x 4300+ 的矩阵。除此之外,路径不允许您放大这一事实。因此,对于图表,我看到了一个巨大的斑点,我无法深入到各个班级。 :-(但我又没有太多时间看它。
  • 我发现我可以使用 CDL 语言使用 NDepend 找到我需要的信息。
  • 那是一个相当大的项目,我不羡慕测试说的项目。
【解决方案2】:

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

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

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

编辑:

与 Visual Studio 中的“查找所有引用”类似,它只会查找 直接 引用。如果您还想查找 间接 引用(例如:method1 引用 method2,method2 引用 method3 - 您希望看到从 method1 到 method3 的连接),您需要这样做使用递归。

【讨论】:

    【解决方案3】:

    试试Jb EvainCILReaderCecil

    他提到了类似问题的好解决方案here

    【讨论】:

      【解决方案4】:

      如果您只是在搜索工具,Reflector 可能会通过一些插件来完成。

      在这里您可以找到各种加载项:http://reflectoraddins.codeplex.com/

      FileGenerator 等一些插件可以将 Reflector 输出直接复制到文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多