为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕标5832272 2021-11-07 19:38:55
我有一个要求,我需要知道类 ( ApiController )的名称,该类具有一个方法 ( GetMethod ),该方法由来自不同类 ( OtherClass ) 的另一个方法 ( OtherMethod )调用。为了帮助解释这一点,我希望下面的伪代码片段有所帮助。接口控制器.cspublic class ApiController{    public void GetMethod()    {        OtherMethod();    }}其他类.cspublic class OtherClass(){    public void OtherMethod()    {        Console.WriteLine(/*I want to get the value 'ApiController' to print out*/)    }}我试过的:我看过如何找到调用当前方法的方法?答案将使我获得调用方法(OtherMethod)而不是具有该方法的类(ApiController)我尝试[CallerMemberName]并使用了StackTrace属性,但这些属性并没有让我知道方法的类名
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

using System.Diagnostics;
var className = new StackFrame(1).GetMethod().DeclaringType.Name;

进入Stack的上一层,找到方法,并从方法中获取类型。这避免了您需要创建一个昂贵的完整 StackTrace。

FullName如果您想要完全限定的类名,则可以使用。

编辑:边缘案例(突出显示下面评论中提出的问题)

  1. 如果启用了编译优化,调用方法可能会被内联,因此您可能无法获得预期的值。(信用:约翰博特

  2. async方法被编译成一个状态机,所以同样,你可能不会得到你所期望的。(信用:菲尔K


查看完整回答
反对 回复 2021-11-07
?
守着一只汪

TA贡献1872条经验 获得超3个赞

所以可以这样做,

new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().DeclaringType.Name

StackFrame表示调用堆栈上的一个方法,索引 1 为您提供包含当前执行的方法的直接调用者的框架,ApiController.GetMethod()在此示例中。

现在您有了框架,然后MethodInfo通过调用检索该框架的StackFrame.GetMethod(),然后使用 的DeclaringType属性MethodInfo来获取定义方法的类型,即ApiController.


查看完整回答
反对 回复 2021-11-07
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您可以通过以下代码实现此目的


首先你需要添加命名空间 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);

    }

}

试试这个可能对你有帮助


查看完整回答
反对 回复 2021-11-07
  • 3 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信