【问题标题】:When calling a static method on parent class, can the parent class deduce the type on the child (C#)?在父类上调用静态方法时,父类可以推断出子类(C#)的类型吗?
【发布时间】:2010-05-25 15:32:47
【问题描述】:

假设我们有 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 规则,即父母不必了解孩子的任何事情),简而言之就是(让我知道如果你想要长版):

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

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

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

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

【问题讨论】:

    标签: c# .net-3.5 inheritance static-methods


    【解决方案1】:

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

    【讨论】:

    • 真该死。哦,C# 事件大师,使用 EventHandler 事件 {add{} remove{}} 方法处理类型化事件有什么技巧吗?
    【解决方案2】:

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

    您可以使用泛型基类或将方法设为泛型。

    【讨论】:

    • 我考虑了通用基类方法。但似乎....为这个事件实现而遍历并泛化我们所有的继承结构似乎是多余的。
    • 顺便说一句,我听说在 genericfy 上声明商标! ;) 要是我第一次使用它时没有拼错就好了。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我认为这是不可能的,原因很简单,Child.SaveEvent 并不真正存在SaveEvent 仅在 Parent 中声明,尽管编译器允许您将其称为 Child.SaveEvent

      要做你需要做的事,你真的不应该使用静态方法。您可以轻松定义一个非静态SaveEvent,它的行为完全符合需要。如果你真的需要一个静态包装器,你可以使用单例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        相关资源
        最近更新 更多