2010-05-25 70 views
1

假设我们有2个类,Child和它继承的类,Parent。在父类上调用静态方法时,父类是否可以推导子类(C#)上的类型?

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

class Child : Parent 
{ 
} 

是否有可能在父类中确定如何调用该方法?因为我们可以把它叫做两种方式:

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

我目前的做法是试图用:

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

但似乎都返回父类型。

如果你想知道我到底想要完成什么(以及为什么我违反了基本的OOP规则,父母不应该知道关于孩子的任何内容),那么这就是(让我知道你是否想要长版本):

我有一个模型结构,代表我们保留到数据库的一些数据。所有这些模型都从一个抽象的Parent继承。这个父节点实现了一些事件,比如SaveEvent,DeleteEvent等。我们希望能够订阅特定于该类型的事件。因此,即使该事件是在父,我希望能够做到:

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

我在的地方,该事件实际上是由事件处理程序的字典,按类型散列支持一切。我需要做的最后一件事是在做Child.SaveEvent时正确检测Child类型。

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

回答

5

否 - 拨打Child.MyFunction()导致IL直接拨打Parent.MyFunction()。生成的二进制文件基本上不可区分。

+0

不错。哦,C#事件的大师,是否有任何技巧使用EventHandler Event {add {} remove {}}方法来完成类型化事件? – Matt 2010-05-25 15:36:36

0

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

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

+0

我认为是通用的基类方法。但是,似乎......过分地通过并且将这个事件实现中的所有继承结构进行了genricify。 – Matt 2010-05-25 15:39:01

+0

顺便说一句,我听到通过声称商标的单词genericfy! ;)如果只有我没有拼错我的第一次使用它。 – Matt 2010-05-25 15:48:35

0

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

要做你需要做的事情,你真的不应该使用静态方法。您可以轻松定义一个非常静态的SaveEvent,其行为完全按照需要进行。如果你确实需要一个静态包装器,你可以使用一个单例。

0

我根本不知道代码,但我质疑在这种情况下使用静态方法的智慧。也许你需要一个单独的“经理”类,它是一个单身人士,它负责所有模型对象的事件以及其他协调任务。