繁体   English   中英

在父类上调用静态方法时,父类可以推断子类(C#)的类型吗?

[英]When calling a static method on parent class, can the parent class deduce the type on the child (C#)?

假设我们有2个类,Child,继承自其的类,Parent。

class Parent
{
    public static void MyFunction(){}
}

class Child : Parent
{
}

是否可以在父类中确定如何调用该方法? 因为我们可以用两种方式来称呼它:

Parent.MyFunction();
Child.MyFunction();

我当前的方法是尝试使用:

MethodInfo.GetCurrentMethod().ReflectedType; // and
MethodInfo.GetCurrentMethod().DeclaringType;

但是两者似乎都返回了Parent类型。

如果您想知道什么,正是我在尝试达成的目标(以及为什么我违反了基本的OOP规则,即父母不必对孩子有任何了解),它的简短之处在于(让我知道您是否愿意长版):

我有一个Model结构,表示一些持久化到数据库的数据。 所有这些模型都继承自抽象的Parent。 该父级实现了几个事件,例如SaveEvent,DeleteEvent等。我们希望能够订阅特定于该类型的事件。 因此,即使事件在父事件中,我也希望能够做到:

Child.SaveEvent += new EventHandler((sender, args) => {});

我已经准备好了一切,该事件实际上由事件处理程序字典支持,并按类型进行哈希处理。 我要做的最后一件事是在执行Child.SaveEvent时正确检测Child类型。

我知道我可以在每个子类中实现该事件(甚至通过使用抽象来强制执行该事件),但最好将其全部保留在父类中,这是实际触发事件的类(因为它实现了通用的save /删除/更改功能)。

否-调用Child.MyFunction()导致IL,该IL直接调用Parent.MyFunction() 生成的二进制文件基本上是无法区分的。

我要做的最后一件事是在执行Child.SaveEvent时正确检测Child类型。

您可以使用通用基类,也可以使方法通用。

我认为这是不可能的,原因简单,原因是Child.SaveEvent 实际上并不存在 SaveEvent仅在声明Parent ,虽然编译器可以让你称呼其为Child.SaveEvent

要执行您需要做的事情,您实际上不应该使用静态方法。 您可以轻松定义一个完全符合需要的非静态SaveEvent 如果确实需要静态包装器,则可以使用单例。

我完全不知道代码,但是我怀疑在这种情况下使用静态方法的智慧。 也许您需要一个单独的“ Manager”类,该类是一个单例对象,用于处理所有模型对象的事件以及其他协调任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM