C# 反思与方法运用

C# 反思与方法运用,c#,reflection,C#,Reflection,我在不同的程序集中有A类和B类,我需要知道的是,是否有办法通过反射获得B类方法中方法A.foo()的用法。我读过,也许是IL 谢谢您的帮助。不,您不能使用反射来完成此操作。反射基于对象的元数据;他们公开的公共API。它们的内部实现根本无法通过反射访问。您可以使用方法读取方法体。那你就得自己去找用法了。我正在创建一个示例 此示例可能有助于: Assembly assembly = Assembly .GetAssembly(typeof(B)); List<Typ

我在不同的程序集中有A类和B类,我需要知道的是,是否有办法通过反射获得B类方法中方法A.foo()的用法。我读过,也许是IL


谢谢您的帮助。

不,您不能使用反射来完成此操作。反射基于对象的元数据;他们公开的公共API。它们的内部实现根本无法通过反射访问。

您可以使用方法读取方法体。那你就得自己去找用法了。我正在创建一个示例

此示例可能有助于:

   Assembly assembly = Assembly
       .GetAssembly(typeof(B));

   List<Type> types = assembly.GetTypes().ToList();

   Type controller = types
   .Where(t => t.Name == "a-class-name")
   .Single();

   List<MethodInfo> methods = controller
   .GetMethods().ToList();

   MethodInfo method = methods
   .Where(m => m.Name == "a-method-name")
   .First();

   MethodBody body = method
   .GetMethodBody();

   // Search body.LocalVariables
Assembly=Assembly
.GetAssembly(类型(B));
列表类型=assembly.GetTypes().ToList();
类型控制器=类型
.Where(t=>t.Name==“a-class-Name”)
.Single();
列表方法=控制器
.GetMethods().ToList();
MethodInfo方法=方法
.其中(m=>m.Name==“a-method-Name”)
.First();
方法体=方法体
.GetMethodBody();
//搜索body.LocalVariables

实际上,我写了一篇关于这方面的文章。

您是否考虑过使用像NinIQ或NDepend这样的代码分析工具?在NDepend中,这将非常简单:

from t in Types 
where t.IsUsing ("ClassLibrary1.A.Foo()")
select new { t }

如果您在运行时确实需要这些信息,那么可以使用CQLinq。但如果我是你,我会重新考虑为什么我想在运行时找到这样的信息…

@saeednemati他们不使用反射(或者至少不只是反射)。他们正在查看二进制数据本身,只知道如何解释它(或者无论如何尝试解释)。当只使用反射时,您看到的是这些工具正在使用的信息的子集。封面下的反射使用Mono.Cecil来读取指令。反射不包括反编译器,您需要使用反编译器来查看代码使用另一个类的哪些成员。反射只提供声明。反编译器广泛使用,不要自己写。Saeed,你能给我一份它现在不工作的副本吗