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

时间:2009-12-29 17:04:31

标签: c# .net 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
    }
}

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

Type1使用者:{Type3}

Type2使用者:{Type1,Type3}

Type3使用者:{Type1,Type2}

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

我尝试了什么:

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

编辑:

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

答案 2 :(得分:0)

如果您只是在搜索工具,Reflector可能会使用一些加载项。

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

FileGenerator这样的插件可以将Reflector输出直接复制到文件中。

答案 3 :(得分:0)

尝试Jb EvainCILReaderCecil

他提到了类似问题here

的好解决方案