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 |
名称为"Call",类型为"Caller"
两年后更新,因为我在这个问题上仍获得了支持
在.NET 4.5中,现在有一种更简单的方法可以做到这一点。你可以利用
使用前面的示例:
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 } } |
你可以通过使用
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; } |
从技术上讲,您可以使用stacktrace,但这非常慢,并且不会给您期望的很多时间的答案。这是因为在发布版本期间,可能会发生将删除某些方法调用的优化。因此,在发行版中不能确定stacktrace是否"正确"。
实际上,在C中没有任何简单或快速的方法可以做到这一点。您真的应该问自己为什么需要这个,以及如何构建应用程序,这样您就可以在不知道哪个方法调用它的情况下做您想要的事情。
是的,在普林西比是可能的,但它不是免费的。
您需要创建一个stacktrace,然后可以查看调用堆栈的stackframe。