关于c#:如何使用反射获取调用方法名称和类型?

How do I get the calling method name and type using reflection?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How can I find the method that called the current method?

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

是否可能有C反射?


1
2
3
4
5
6
7
8
9
10
public class SomeClass
{
    public void SomeMethod()
    {
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    }
}

现在让我们假设您有另一个这样的类:

1
2
3
4
5
6
7
8
public class Caller
{
   public void Call()
   {
      SomeClass s = new SomeClass();
      s.SomeMethod();
   }
}

名称为"Call",类型为"Caller"

两年后更新,因为我在这个问题上仍获得了支持

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

使用前面的示例:

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


你可以通过使用StackTrace来使用它,然后你可以从中得到反射类型。

1
2
3
4
5
6
7
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);


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

1
2
3
4
5
6
7
8
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;
}

StackFrame数组上的1索引将提供名为MyMethod的方法。


从技术上讲,您可以使用stacktrace,但这非常慢,并且不会给您期望的很多时间的答案。这是因为在发布版本期间,可能会发生将删除某些方法调用的优化。因此,在发行版中不能确定stacktrace是否"正确"。

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


是的,在普林西比是可能的,但它不是免费的。

您需要创建一个stacktrace,然后可以查看调用堆栈的stackframe。