代码之家  ›  专栏  ›  技术社区  ›  George Mauer

使用C#反射访问stacktrace上的对象

  •  3
  • George Mauer  · 技术社区  · 16 年前

    我想使用.NET中的反射来访问调用我的方法的对象。我想在某种程度上可以看到stacktrace。我知道它不安全的原因有很多,但我只需要获取和编目一些属性值。

    我该怎么做?

    更新 :我是个白痴,我忘了说这是C#

    3 回复  |  直到 16 年前
        1
  •  5
  •   Ben M    16 年前
    var methodInfo = new StackFrame(1).GetMethod();
    

    返回调用当前方法的方法。

    请注意,编译器可能会内联或以其他方式优化对方法的调用(尽管听起来可能不是这样),这会阻碍预期的行为。为了安全起见,请用以下方法装饰您的方法:

    [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
    

    请注意,这与允许编译器执行其工作相反。警告清空器。

    编辑 哦,我知道你想要 实例 调用了您的方法。没有办法得到这些信息。

        2
  •  2
  •   Amy B    16 年前

    如果静态方法调用您呢?

    如果打电话的人把自己交给你,不是更好(更简单)的合同吗?

        3
  •  2
  •   bashmohandes    16 年前

    您可以使用StackTrace&StackFrame类

    下面是MSDN的一个例子

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

    这是一个例子,应该打印“Main”

    class Program
    {
        static void Main(string[] args){
            Func();
        }
        static void Func(){
            StackFrame frame = new StackFrame(1);
            StackTrace trace = new StackTrace(frame);
            var method = frame.GetMethod();
            Console.WriteLine(method.Name);
        }
    }