Как получить доступ к статическим методам универсальных типов - PullRequest
11 голосов
/ 05 февраля 2012
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 ]

12 голосов
/ 05 февраля 2012

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

var s = BusinessObject.MyStaticMethod();

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

2 голосов
/ 05 февраля 2012

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

O.MyStaticMethod(); 

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

2 голосов
/ 05 февраля 2012

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

void SomeMethod()
{
    var s = BusinessObject.MyStaticMethod(); // <- How to do this?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...