Reflection + C#如何获取所有引用?

10

使用System.Reflection,我可以获取特定类中的所有方法

我需要知道这些方法的引用。例如:在Visual Studio中,如果要查看特定对象的引用

  • 右键单击该对象并选择“查找所有引用”
  • Visual Studio会显示所选对象的引用

我想做同样的事情,但是通过反射或其他方式从代码中实现。

我能做到吗?


4
为什么人们要点赞这个问题?它充满了错别字和语法错误,而且它要求做一些几乎没有实际用途的事情(除非你正在试图重新发明 Reflector),最有可能的结果是它自己成为日报上的一个笑话。 - Aaronaught
@Aaronaught,这个Up-VotdEd只是为你准备的 :) - Joseph Gordon
1
@Aaronaught(以及那些点赞他的评论的人)糟糕的“英语”也让我感到烦恼,但是在 Stack Exchange 上闲逛多年后,我发现在这种情况下应该做的适当事情是编辑问题以修复这种“英语”,而不是抱怨。 - Mike Nakis
@Aaronaught 至于这个问题的实用性或提问者的动机,没有人能够判断。唯一需要关注的是这是否是一个有效的问题,而它确实是一个有效的问题。此外,不管 Christiam Teran 会如何使用答案,追求知识本身就是一种高尚的追求。 - Mike Nakis
那个问题:c#反射和查找所有引用https://dev59.com/xW035IYBdhLWcg3wVeXn 是一个重复的问题,因为那个问题比这个问题晚。尽管如此,那个问题已经得到了非常好的答案! - Mike Nakis
4个回答

5

使用反射无法完成此操作。反射是一种用于检查元数据和程序集的工具。要查找给定方法/类型的所有引用,您需要检查程序集的底层IL。反射只具有非常有限的IL功能(仅将其作为字节数组返回)。您需要自定义检查该字节流以收集有关其引用内容的任何上下文。


2

这并不是在特定类的运行时反射直接访问的内容。您需要检查整个源代码树或结果 IL,以确定是否有指向特定方法的任何引用具有相同名称的正确重载和签名,以便找到对该方法的引用。

此外,如果没有额外的工作,您将永远无法找到通过反射本身调用的特定方法的引用。(这是为什么混淆这种代码很具有挑战性和容易出错的原因之一。)


2

0

微软以开源许可证发布了Common Compiler Infrastructure项目。这些项目旨在支持许多与编译器相关的功能,包括您所提到的汇编分析。文档有限,因此您需要对ECMA-335(公共语言基础结构)有深入的理解,才能有效地将其用于您的目的。

这里没有神奇的代码示例。这是一个庞大而相当复杂的任务,在大部分时间里你将独自完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接