是否可以访问从该方法中调用方法的代码行?

时间:2010-05-18 17:14:50

标签: .net reflection

免责声明:

  • 我对任何真正的生产代码都不感兴趣。
  • 我没有声称有一个的原因,我有兴趣这样做。
  • 我意识到,如果这种情况有任何可能,那么必须要做一些非常不可取的事情。

那说......这可能吗?我真的很想知道。

换句话说,如果我有这样的话:

int i = GetSomeInteger();

GetSomeInteger中的是否有任何方法代码可以“知道”在变量i的赋值中被调用的事实?

再次:没有兴趣在任何真实场景中这样做。好奇!

2 个答案:

答案 0 :(得分:2)

可以使用System.Diagnostics.StackTrace。

例如,您可以像这样获取调用方法的名称:

    private static void stackExample()
    {
        var stack = new System.Diagnostics.StackTrace(true); // pass true to get more stack info

        var callingMethod = stack.GetFrame(1).GetMethod().Name;
        var callingLine = stack.GetFrame(1).GetFileLineNumber();

        Console.WriteLine("callingMethod: " + callingMethod + " on line " + callingLine.ToString());
    }

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

这不会给你调用方法的代码行,你必须有权访问它的源代码。 stack.GetFrame(1).GetFileName()将为您提供包含该方法的源代码的文件名。你可以从这里做什么,方法信息和行号是打开源文件并获得有问题的代码行。

GetMethod()为您提供各种重要信息,例如方法所在的模块,然后从那里获取汇编信息。

搜索所有元数据实际上非常有趣,它会告诉您各种关于代码的很酷的东西。

您无法获得实际代码行的原因是C#表单中的源本身未存储在程序集中。虽然你可以获得IL,但它更难以阅读。 :)

答案 1 :(得分:0)

我不知道具体如何访问它,但理论上,如果代码是使用调试符号编译的(例如,在调试配置中),那么信息就在那里。