如何使用反射获取调用方法名称和类型?

时间:2010-06-22 17:51:07

标签: c# reflection

  

可能重复:
  How can I find the method that called the current method?

我想编写一个获取调用方法名称的方法,以及包含调用方法的类的名称。

是否可以使用C#反射?

5 个答案:

答案 0 :(得分:401)

public class SomeClass
{
    public void SomeMethod()
    {
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    }
}

现在让我们说你有另一个这样的课:

public class Caller
{
   public void Call()
   {
      SomeClass s = new SomeClass();
      s.SomeMethod();
   }
}

名称将为“呼叫”,类型将为“呼叫者”

更新两年后,因为我仍然对此事进行投票

在.Net 4.5中,现在有一种更简单的方法可以做到这一点。您可以利用CallerMemberNameAttribute

继续前面的例子:

public class SomeClass
{
    public void SomeMethod([CallerMemberName]string memberName = "")
    {
        Console.WriteLine(memberName); //output will be name of calling method
    }
}

答案 1 :(得分:21)

您可以使用StackTrace来使用它,然后您可以从中获得反射类型。

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);

答案 2 :(得分:11)

实际上可以使用当前堆栈跟踪数据和反射的组合来完成。

public void MyMethod()
{
     StackTrace stackTrace = new System.Diagnostics.StackTrace();
     StackFrame frame = stackTrace.GetFrames()[1];
     MethodInfo method = frame.GetMethod();
     string methodName = method.Name;
     Type methodsClass = method.DeclaringType;
}

1数组上的StackFrame索引将为您提供调用MyMethod

的方法

答案 3 :(得分:7)

是的,在原则上它是可能的,但它不是免费的。

您需要创建一个StackTrace,然后您可以查看调用堆栈的StackFrame's

答案 4 :(得分:7)

从技术上讲,你可以使用StackTrace,但这很慢,并且不会给你很多时候所期望的答案。这是因为在发布版本中,可能会发生删除某些方法调用的优化。因此,您无法确定在发布时堆栈跟踪是否“正确”。

实际上,在C#中没有任何万无一失或快速的方法。您应该问自己为什么需要这个以及如何构建应用程序,这样您就可以在不知道调用它的方法的情况下做您想做的事情。

相关问题