Я надеялся сделать что-то подобное, но в C # это оказалось незаконным:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
Я получаю ошибку времени компиляции: «'T' - это 'параметр типа', который недопустим в данном контексте».
Учитывая параметр универсального типа, как я могу вызвать статический метод для универсального класса? Статический метод должен быть доступен с учетом ограничения.
Ответы:
В этом случае вы должны просто вызвать статический метод для ограниченного типа напрямую. C # (и CLR) не поддерживают виртуальные статические методы. Так:
... не может отличаться от:
Перебор параметра универсального типа является ненужным косвенным обращением и поэтому не поддерживается.
источник
return SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection();
работать? Если да, вы можете добавить это к своему ответу. Спасибо. У меня это сработало. В моем случае у моего класса был параметр типа, поэтому я это сделал,return SomeBaseClass<T>.StaticMethodOnSomeBaseClassThatReturnsCollection();
и это сработало.Чтобы уточнить предыдущий ответ, я думаю, что размышление ближе к тому, что вы хотите здесь. Я мог бы назвать 1001 причину, почему вы должны или не должны что-то делать, я просто отвечу на ваш вопрос, как и было задано. Я думаю, вам следует вызвать метод GetMethod для типа универсального параметра и перейти оттуда. Например, для функции:
Где T - любой класс, имеющий статический метод fetchAll ().
Да, я знаю, что это ужасно медленно и может привести к сбою, если someParent не заставит все свои дочерние классы реализовать fetchAll, но ответит на заданный вопрос.
источник
Единственный способ вызвать такой метод - это отражение, однако похоже, что можно было бы обернуть эту функциональность в интерфейс и использовать шаблон IoC / factory / etc на основе экземпляров.
источник
Похоже, вы пытаетесь использовать дженерики, чтобы обойти тот факт, что в C # нет «виртуальных статических методов».
К сожалению, это не сработает.
источник
На данный момент вы не можете. Вам нужен способ сообщить компилятору, что у T есть этот метод, и в настоящее время нет способа сделать это. (Многие подталкивают Microsoft к расширению того, что может быть указано в общем ограничении, поэтому, возможно, это станет возможным в будущем).
источник
Здесь я публикую пример, который работает, это обходной путь
источник
public T : SomeBaseClass
значит?Я просто хотел сказать, что иногда делегаты решают эти проблемы, в зависимости от контекста.
Если вам нужно вызвать статический метод как своего рода фабрику или метод инициализации, вы можете объявить делегат и передать статический метод соответствующей универсальной фабрике или тому, что требуется для этого «универсального класса с этим статическим методом».
Например:
К сожалению, вы не можете обеспечить, чтобы у класса был правильный метод, но вы можете, по крайней мере, во время компиляции обеспечить, чтобы в результирующем заводском методе было все, что он ожидал (т.е. метод инициализации с точно правильной подписью). Это лучше, чем исключение отражения во время выполнения.
Этот подход также имеет некоторые преимущества, например, вы можете повторно использовать методы инициализации, сделать их методами экземпляра и т. Д.
источник
Вы можете сделать это с помощью отражения, как описано здесь.Из-за того, что ссылка не работает, я нашел соответствующие детали в машине обратного пути:
источник