如何访问泛型类型的静态方法


public class BusinessObjects<O>
    where O : BusinessObject
{
    void SomeMethod()
    {
        var s = O.MyStaticMethod(); // <- How to do this?
    }
}
public class BusinessObject
{
    public static string MyStaticMethod()
    {
        return "blah";
    }
}

是否有正确的面向对象方法来实现这一目标,或者我需要求助于反思?

编辑:我试图过度简化这个问题,并遗漏了一个重要的观点。 MyStaticMethod 使用反射,需要派生类型来返回正确的结果。 然而,我刚刚意识到我的设计中的另一个缺陷,那就是我不能有一个静态的虚拟方法,我认为这就是我需要的。

看起来我需要找到另一种方法来解决这个问题。

不能通过泛型类型参数访问静态方法,即使它被限制为类型。 只需直接使用约束类

var s = BusinessObject.MyStaticMethod();

注意:如果要根据实例化的O类型调用静态方法,则无需反射就无法做到这一点。 .Net 中的泛型在编译时静态绑定到方法(不像在实例化时绑定的 C++(。 由于无法静态绑定到实例化类型的静态方法,因此这是不可能的。 虚拟方法略有不同,因为您可以静态绑定到虚拟方法,然后让动态调度在实例化类型上调用正确的方法。

不能像这样引用静态成员的原因:

O.MyStaticMethod(); 

是因为你不知道O是什么类型。 是的,它继承自 BusinessObject,但静态成员不会在类型之间继承,因此您只能从 BusinessObject 引用 MyStaticMethod。

如果你强迫OBusinessObject继承,为什么不这样称呼它:

void SomeMethod()
{
    var s = BusinessObject.MyStaticMethod(); // <- How to do this?
}

相关内容

最新更新