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

时间:2012-02-05 02:49:24

标签: c# oop generics static

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使用反射并需要派生类型来返回正确的结果。但是,我刚刚意识到我设计中的另一个缺陷是我不能使用静态虚拟方法,而且我认为这就是我需要的。

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

3 个答案:

答案 0 :(得分:12)

即使它被约束为某种类型,也无法通过泛型类型参数访问静态方法。只需直接使用约束类

var s = BusinessObject.MyStaticMethod();

注意:如果您希望根据O的实例化类型调用静态方法,而这种类型在没有反射的情况下是不可能的。 .Net中的泛型在编译时静态绑定到方法(与在实例化时绑定的C ++不同)。由于无法静态绑定到实例化类型上的静态方法,因此这是不可能的。虚方法有点不同,因为您可以静态绑定到虚方法,然后让动态调度在实例化类型上调用正确的方法。

答案 1 :(得分:2)

如果您强制O继承BusinessObject,为什么不这样称呼它:

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

答案 2 :(得分:2)

您无法像这样引用静态成员的原因:

O.MyStaticMethod(); 

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