.NETreflection:查找使用的类型

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

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}

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

我尝试过的:

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

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

有什么建议?

这是不容易的。 您必须获取MethodInfo,PropertyInfo,FieldInfo等的实例,以满足以下所有条件:

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

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

编辑:

与Visual Studio中的“查找所有引用”一样,这只会找到直接引用。 如果您还想查找间接引用(例如:method1引用method2,方法2引用method3 – 您希望看到从method1到method3的连接),则需要使用递归执行此操作。

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

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

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

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

试试Jb Evain的CILReader或Cecil

他在这里提到了很好的解决方案