C# 在派生类型上调用static时是否可以检测类型
给定 打电话的时候C# 在派生类型上调用static时是否可以检测类型,c#,static,C#,Static,给定 打电话的时候 public class Original { public static DoStuff() { } } public class Derived : Original { } 撇开需求的古怪不谈,在DoStuff()中是否可以检测调用它的类 i、 e.在DoStuff()的实现中,是否有可能分辨出Original.DoStuff()之间的差异和派生的.DoStuff()不在C#中,否-编译后的IL直接引用Original.DoStuff (我刚刚验证了VB显然
public class Original {
public static DoStuff() {
}
}
public class Derived : Original {
}
撇开需求的古怪不谈,在DoStuff()
中是否可以检测调用它的类
i、 e.在DoStuff()
的实现中,是否有可能分辨出Original.DoStuff()之间的差异
和派生的.DoStuff()代码>不在C#中,否-编译后的IL直接引用Original.DoStuff
(我刚刚验证了VB显然对静态调用做了相同的事情,而IIRC在通过“子”引用调用虚拟方法时,生成的代码中VB和C有区别。)除非Derived
提供了自己对DoStuff
,Derived.DoStuff()的定义
相当于Original.DoStuff()
。静态方法/成员变量与类关联,而不是与任何实例(对象)关联。正如Jon所说,在C#中不可能,因为静态方法具有唯一的入口点。反正你是对的,,当你有一个使用活动记录样式模式的核心库,你想创建一个派生类,例如类MyAppUser:SystemCoreUser
并使用类似MyAppUser.Load(id)的东西时,你会需要检测它。它是静态的,这与它有什么关系?你为什么需要这样做?@CarstenKönig
。您可以在静态方法中使用反射来更新正确的类型。我承认这是一个奇怪的请求,而且还有更好的模式,我只是好奇。我以前曾见过用于此目的的模式公共类派生:Original
(奇怪的重复出现的泛型模式),但我建议反对它,因为大多数样式分析工具都会将此标记为警告,告诉您直接调用Original.DoStuff()
(因为通过派生类调用静态方法通常会产生误导,而且常常是错误的)。
Derived.DoStuff();