я хотел бы получить тип производного класса от статического метода его базового класса.
Как это может быть выполнено?
Спасибо!
class BaseClass {
static void Ping () {
Type t = this.GetType(); // should be DerivedClass, but it is not possible with a static method
}
}
class DerivedClass : BaseClass {}
// somewhere in the code
DerivedClass.Ping();
Если я не ошибаюсь, код генерируется для BaseClass.Ping ()
и DerivedClass.Ping ()
одинаково, поэтому сделать метод статическим без указания ему каких-либо аргументов не сработает. Попробуйте передать тип в качестве аргумента или через параметр универсального типа (для которого вы можете применить ограничение наследования).
class BaseClass {
static void Ping<T>() where T : BaseClass {
Type t = typeof(T);
}
}
Вы бы назвали это так:
BaseClass.Ping<DerivedClass>();
Статический метод определен для типа. Нет никакого «этого». Вместо этого вам нужно сделать это методом экземпляра:
class BaseClass {
public void Ping() {
Type t = this.GetType(); // This will work, since "this" has meaning here...
}
Затем вы можете сделать:
class DerivedClass : BaseClass {}
DerivedClass instance = new DerivedClass();
instance.Ping();
Невозможно получить производный класс из статического метода. В качестве примера, чтобы проиллюстрировать, почему, представьте, что у BaseClass есть 2 подкласса - DerivedClass и AnotherDerivedClass - какой из них следует вернуть? В отличие от полиморфных нестатических методов, нет возможной ассоциации с производным классом, вызывающим статический метод в базовом классе - тип времени компиляции и тип времени выполнения такие же, как у статического вызова метода.
Вы можете либо сделать метод нестатическим, чтобы затем получить правильный тип с помощью полиморфизма, либо создать статические «переопределения» метода в подклассах, например
class DerivedClass : BaseClass
{
void Ping() {
BaseClass.Ping();
// or alternatively
BaseClass.Ping(Type.GetType("DerivedClass"));
}
}
Затем ваш клиентский код может вызвать метод в производном классе, чтобы явно указать, что ему нужна версия производного класса. При необходимости вы также можете передать тип DerivedClass в качестве параметра методу базового класса, чтобы предоставить контекст, в котором метод был вызван через производный класс.
Почему бы просто не использовать уже существующие методы?
Если у вас есть
class BaseClass {}
partial class DerivedClass : BaseClass {}
, вы можете посмотрите
DerivedClass.GetType().BaseType;
Просто предположение (не проверено)
Type t = MethodBase.GetCurrentMethod().DeclaringType;