Получите тип производного класса от статического метода класса основы

я хотел бы получить тип производного класса от статического метода его базового класса.

Как это может быть выполнено?

Спасибо!

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();
19
задан Marco Bettiolo 17 June 2010 в 17:55
поделиться

5 ответов

Если я не ошибаюсь, код генерируется для BaseClass.Ping () и DerivedClass.Ping () одинаково, поэтому сделать метод статическим без указания ему каких-либо аргументов не сработает. Попробуйте передать тип в качестве аргумента или через параметр универсального типа (для которого вы можете применить ограничение наследования).

class BaseClass {
    static void Ping<T>() where T : BaseClass {
        Type t = typeof(T);
    }
}

Вы бы назвали это так:

BaseClass.Ping<DerivedClass>();
14
ответ дан 30 November 2019 в 02:22
поделиться

Статический метод определен для типа. Нет никакого «этого». Вместо этого вам нужно сделать это методом экземпляра:

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();
4
ответ дан 30 November 2019 в 02:22
поделиться

Невозможно получить производный класс из статического метода. В качестве примера, чтобы проиллюстрировать, почему, представьте, что у BaseClass есть 2 подкласса - DerivedClass и AnotherDerivedClass - какой из них следует вернуть? В отличие от полиморфных нестатических методов, нет возможной ассоциации с производным классом, вызывающим статический метод в базовом классе - тип времени компиляции и тип времени выполнения такие же, как у статического вызова метода.

Вы можете либо сделать метод нестатическим, чтобы затем получить правильный тип с помощью полиморфизма, либо создать статические «переопределения» метода в подклассах, например

class DerivedClass : BaseClass
{
   void Ping() { 
     BaseClass.Ping();
     // or alternatively
     BaseClass.Ping(Type.GetType("DerivedClass"));
   }
}

Затем ваш клиентский код может вызвать метод в производном классе, чтобы явно указать, что ему нужна версия производного класса. При необходимости вы также можете передать тип DerivedClass в качестве параметра методу базового класса, чтобы предоставить контекст, в котором метод был вызван через производный класс.

0
ответ дан 30 November 2019 в 02:22
поделиться

Почему бы просто не использовать уже существующие методы?

Если у вас есть

class BaseClass {}
partial class DerivedClass : BaseClass {}

, вы можете посмотрите

DerivedClass.GetType().BaseType;
0
ответ дан 30 November 2019 в 02:22
поделиться

Просто предположение (не проверено)

Type t = MethodBase.GetCurrentMethod().DeclaringType;
0
ответ дан 30 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: