You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取调用抽象类方法的实现类类型以用于日志记录?

解决抽象类方法中获取实现类信息的问题

你不需要依赖Environment.StackTrace,直接通过this.GetType()就能拿到当前实例的实际实现类类型(也就是class1)。当子类实例调用父类的非虚方法时,this指向的是子类对象,因此GetType()会返回子类的Type对象,从中可以获取类名、命名空间等所有所需信息。

修改后的代码示例:

public abstract class abstract1
{
    public void Test1()
    {
        // 获取调用该方法的实现类类型
        Type implementingType = this.GetType();
        // 记录实现类信息,示例为输出类全名
        Console.WriteLine($"调用Test1的实现类:{implementingType.FullName}");

        // Do something
    }
}

public class Class1 : abstract1
{
}

public class Class1Test
{
    public void InvokeTest1()
    {
        Class1 c1 = new Class1();
        c1.Test1(); // 输出:调用Test1的实现类:YourNamespace.Class1
    }
}

为什么Environment.StackTrace无法获取子类信息?

因为Test1是抽象类的非虚方法,CLR执行时直接调用父类的方法实现,栈帧中只会记录abstract1.Test1,不会包含子类的调用痕迹。而this的类型始终绑定到实际创建的实例类型,这是获取实现类信息最可靠、性能也最优的方式。

即使后续将Test1改为虚方法,子类重写后调用base.Test1(),这种方式依然有效,因为this始终指向子类实例。

内容的提问来源于stack exchange,提问作者Jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:05:13