反思和方法用法

时间:2013-11-14 22:03:57

标签: c# reflection

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

不,你不能用反射做到这一点。反射基于对象的元数据;他们公开的公共API。他们的内部实现根本无法通过反思来访问。

答案 1 :(得分:0)

您可以使用GetMethodBody()方法阅读方法体。然后你就可以自己找到用法了。我正在创建一个样本......

此示例可能有所帮助:

   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

我实际上写了一篇关于这个here的文章。

答案 2 :(得分:0)

您是否考虑过使用Nitriq或NDepend等代码分析工具?在NDepend的Code Query over LINQ中,它会像以下一样简单:

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

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