Как получить класс Type в базовом классе статического метода в .NET? - PullRequest
1 голос
/ 12 января 2011

Все, что я хочу сделать, похоже на:

public abstract class BaseClass
{
    public static Type GetType()
    {
        return typeof(BaseClass);
    }
}

Но когда я получаю это

public class DerivedClass : BaseClass
{
}

Я хочу получить

Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType());

Какизменить BaseClass, чтобы сделать это утверждение верным?

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Статические методы не наследуются.

Компилятор заменяет BaseClass на DerivedClass при вызове статических методов базового класса через один из его производных классов. Например, вот код IL для вызова DerivedClass.GetType():

IL_0002:  call   class [mscorlib]System.Type Tests.Program/BaseClass::GetType()
2 голосов
/ 12 января 2011

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

Я надеюсь, что ваш примердля простоты, потому что в противном случае повторная реализация GetType () кажется немного бессмысленной - поскольку object.GetType() будет делать именно то, что вы хотите.

Если вам действительно нужно сделать это с помощью статически вызываемого метода - вы можете 't потому что никакая информация о типах на самом деле не доступна статическому методу (как я сказал в первом абзаце).

Если вы на самом деле вызываете этот метод через экземпляр (но я должен спросить, почему !?), тогда вы можете сделатьодин из следующих

a) Сделайте ваш метод экземпляром метода на базе.Затем он может выполнить this.GetType() (используя базовый метод .Net) и вернет окончательный подтип экземпляра.

b) Определить метод расширения для BaseClass, который делает нечто очень похожее:

public static Type GetType2(this BaseClass instance)
{
  return instance.GetType();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...