如何获取调用抽象类方法的实现类类型以用于日志记录?
解决抽象类方法中获取实现类信息的问题
你不需要依赖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
相关产品推荐
相关产品推荐

