【问题标题】:How do I find what methods are called from a C# class method - NOT at run time如何找到从 C# 类方法调用的方法 - 不是在运行时
【发布时间】:2013-01-09 17:49:25
【问题描述】:

我有一个包含太多代码的 C# 类,我想refactor 它。我想做的是从所有public methods 开始,为每个tree 构建一个tree,显示类中的哪些其他方法是从中调用的,然后是从子类中调用的方法,依此类推.

这将使我能够看到哪些private methods 完全属于一个public method,哪些是共享的等等。

请注意,我不想在运行时执行此操作,我希望能够直接查看 .cs file 或在编译后的 DLL 上使用反射。

我知道我可以在编译后的 DLL 上使用反射来获取方法,但我找不到任何方法来找出类中的其他方法调用了哪些方法。

有人有什么想法吗?同样,这不是运行时问题,它纯粹是为了构建一个可重用的实用程序来帮助重构一个超大的类。我正在研究的解决方案中有很多,所以代码会被反复使用。

【问题讨论】:

  • Resharper 有这个。它将向您展示一个方法的所有用法。
  • 方法右键->“查看调用层次结构”?
  • 如果你想自己动手:stackoverflow.com/a/5741770/16959 这是关于这个主题的一个经过充分研究的答案
  • Oded 和 unicron - 感谢您的回复,但我已经知道调用层次结构。但是,除非我错过了什么,否则它们只允许您查看当前方法调用的方法。然后,您需要遍历每个调用的方法并对它们中的每一个执行相同的操作。您还需要在进行过程中跟踪所有这些。这很快就会变得非常痛苦并且容易出错。我正在寻找一种自动生成完整层次结构的方法。如果 R# 或 VS 的功能可以做到这一点,那么请告诉我怎么做,因为我认为他们做不到。
  • Jason - 感谢您的链接,这看起来很棒。我还没有尝试过,因为它看起来需要一些认真的研究,但如果它和它看起来一样好,它应该完全符合我的要求。再次感谢。

标签: c# .net reflection dll refactoring


【解决方案1】:

Visual Studio 2010 具有“查看调用层次结构”操作,您可以在其中查看解决方案中调用代码的所有位置。

根据我的经验,这种静态分析可能有些欠缺,例如可以使用反射、数据绑定、依赖注入容器等动态​​调用方法。

另外,这可能有点偏离主题,并且不适用于您的情况,但我发现找到组件死代码的好方法是拥有一套集成测试。然后您可以运行代码覆盖率,并直观地查看哪些代码路径永远不会执行。

【讨论】:

  • Sebastian - 感谢您的回复,但是如果您阅读了我在上面对 Oded 和 unicron 的回复,您就会明白为什么这个功能不足以满足我的需要。测试是一种有趣的方法,但现在对现有(并且非常大)的类做太多工作,而且很难分析到什么叫什么。
  • 查看调用层次结构实际上向您展示了一种双树 - 或树和根 :) 这样您就可以看到调用给定方法的所有方法以及给定方法调用的所有方法。
  • “代码分析”(如果在您的 VS Studio 版本中可用)可能会有用,尽管它可能无法为您提供所需的一切。此处描述:stackoverflow.com/questions/2020297/…
  • Sebastian - 感谢您的提示,但仍然一次只显示一个级别。构建完整树的图片仍然需要很长时间并且非常缓慢,更不用说容易出错了。我有 VS2010 Pro,但右键单击项目时看不到代码分析选项。你知道怎么做吗,或者它不在我的 VS 版本中? (编辑...)啊,刚刚发现它只有高级和终极版。不好意思,还是谢谢
  • @AvrohomYisroel:如果你还在做这个,我最近偶然发现了stackoverflow.com/questions/5490025/… 这将在编译的 DLL 方法上使用反射
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多