Как обращаться к статическим методам общих типов

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";
    }
}

Есть ли правильный объектно-ориентированный подход к выполнению этого или мне нужно прибегнуть к отражению?

EDIT: Я зашел слишком далеко, пытаясь упростить это для вопроса и оставил важный момент. MyStaticMethod использует отражение и требует, чтобы производный тип возвращал правильные результаты. Тем не менее, я просто понял еще один недостаток в моем дизайне, который заключается в том, что у меня не может быть статического виртуального метода, и я думаю, что мне понадобится.

Похоже, мне нужно найти другой подход к этой проблеме вообще.

Ответ 1

Причина, по которой вы не можете ссылаться на статический член следующим образом:

O.MyStaticMethod(); 

Это потому, что вы не знаете, какой тип O. Да, он наследует от BusinessObject, но статические члены не наследуются между типами, поэтому вы можете ссылаться только на MyStaticMethod из BusinessObject.

Ответ 2

Вы не можете получить доступ к статическому методу через параметр типового типа, даже если он ограничен типом. Просто используйте ограниченный класс напрямую

var s = BusinessObject.MyStaticMethod();

Примечание. Если вы хотите вызвать статический метод на основе созданного типа O, который невозможен без отражения. Generics в .Net статически привязываются к методам во время компиляции (в отличие от С++, который связывается во время создания экземпляра). Поскольку нет способа привязать статически к статическому методу на экземплярном типе, это просто невозможно. Виртуальные методы немного отличаются, потому что вы можете статически привязываться к виртуальному методу, а затем позволить динамической диспетчеризации вызывать правильный метод для создаваемого типа.

Ответ 3

Если вы заставляете O наследовать от BusinessObject, почему бы просто не вызвать его так:

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