代码之家  ›  专栏  ›  技术社区  ›  Matt

在父类上调用静态方法时,父类能否推断子类(c)的类型?

  •  1
  • Matt  · 技术社区  · 14 年前

    假设我们有两个类,子类和它继承的类,父类。

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

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

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

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

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

    但两者都似乎返回父类型。

    如果你想知道我到底想完成什么(以及为什么我违反了基本的OOP规则,家长不必知道孩子的任何情况),那么短的就是这个(如果你想要长的版本,请告诉我):

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

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

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

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   Jon Skeet    14 年前

    不叫 Child.MyFunction() 结果在IL中调用 Parent.MyFunction() 直接。生成的二进制文件基本上是不可区分的。

        2
  •  0
  •   Matthias    14 年前

    我需要做的最后一件事是在执行child.saveevent时正确地检测子类型。

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

        3
  •  0
  •   tster    14 年前

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

        4
  •  0
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

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

    要做您需要做的事情,您真的不应该使用静态方法。你可以很容易地定义一个非静态的 萨维事件 这将完全符合需要。如果您确实需要一个静态包装器,那么可以使用单例。