如何获取包含调用当前方法的方法的类的名称?

我有一个要求,我需要知道类 ( ApiController )的名称,该类具有一个方法 ( GetMethod ),该方法由来自不同类 ( OtherClass ) 的另一个方法 ( OtherMethod )调用。


为了帮助解释这一点,我希望下面的伪代码片段有所帮助。


接口控制器.cs

public class ApiController

{

    public void GetMethod()

    {

        OtherMethod();

    }

}

其他类.cs

public class OtherClass()

{

    public void OtherMethod()

    {

        Console.WriteLine(/*I want to get the value 'ApiController' to print out*/)

    }

}

我试过的:


我看过如何找到调用当前方法的方法?答案将使我获得调用方法(OtherMethod)而不是具有该方法的类(ApiController)

我尝试[CallerMemberName]并使用了StackTrace属性,但这些属性并没有让我知道方法的类名


慕标5832272
浏览 228回答 3
3回答

临摹微笑

using System.Diagnostics; var className = new StackFrame(1).GetMethod().DeclaringType.Name;进入Stack的上一层,找到方法,并从方法中获取类型。这避免了您需要创建一个昂贵的完整 StackTrace。FullName如果您想要完全限定的类名,则可以使用。编辑:边缘案例(突出显示下面评论中提出的问题)如果启用了编译优化,调用方法可能会被内联,因此您可能无法获得预期的值。(信用:约翰博特)async方法被编译成一个状态机,所以同样,你可能不会得到你所期望的。(信用:菲尔K)

守着一只汪

所以可以这样做,new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().DeclaringType.NameStackFrame表示调用堆栈上的一个方法,索引 1 为您提供包含当前执行的方法的直接调用者的框架,ApiController.GetMethod()在此示例中。现在您有了框架,然后MethodInfo通过调用检索该框架的StackFrame.GetMethod(),然后使用 的DeclaringType属性MethodInfo来获取定义方法的类型,即ApiController.

红颜莎娜

您可以通过以下代码实现此目的首先你需要添加命名空间 using System.Diagnostics;public class OtherClass{    public void OtherMethod()    {        StackTrace stackTrace = new StackTrace();        string callerClassName = stackTrace.GetFrame(1).GetMethod().DeclaringType.Name;        string callerClassNameWithNamespace = stackTrace.GetFrame(1).GetMethod().DeclaringType.FullName;        Console.WriteLine("This is the only name of your class:" + callerClassName);        Console.WriteLine("This is the only name of your class with its namespace:" + callerClassNameWithNamespace);    }}的实例stackTrace取决于您的实现环境。您可以在本地或全局定义它或者您可以在不创建StackTrace实例的情况下使用以下方法public class OtherClass{    public void OtherMethod()    {        string callerClassName = new StackFrame(1).GetMethod().DeclaringType.Name;        string callerClassNameWithNamespace = new StackFrame(1).GetMethod().DeclaringType.FullName;        Console.WriteLine("This is the only name of your class:" + callerClassName);        Console.WriteLine("This is the only name of your class with its namespace:" + callerClassNameWithNamespace);    }}试试这个可能对你有帮助
打开App,查看更多内容
随时随地看视频慕课网APP