1.
GetType не определен как виртуальный и поэтому не может быть переопределен.System.Type не переопределяет объект GetType, он скрывает его (в C # он будет представлен с ключевым словом new).Если вы используете инструмент разборки, такой как ILSpy, вы увидите, что он реализован следующим образом:
public new Type GetType()
{
return base.GetType();
}
Как вы можете видеть, он вызывает только реализацию GetType базового класса (который является объектом),следовательно, конечный результат одинаков.Эта версия GetType обеспечивает формальную реализацию интерфейса _Type.Обычно вам не нужно беспокоиться об этом интерфейсе, он существует из соображений совместимости.
2.
Метод GetType определен в объекте и возвращает System.Type.Но более пристальный взгляд на System.Type показывает, что он определен как абстрактный, поэтому его никогда нельзя создать.Таким образом, способ получить что-то конкретное из GetType - это получить другой тип, производный от System.Type.И действительно, мы получаем экземпляр System.RuntimeType, производный от System.Type.
Причина в том, что должен быть только один экземпляр, представляющий данный тип.То есть, не имеет значения, сколько разных экземпляров строки (например) вы вызываете GetType, вы все равно получите точно такой же экземпляр, потому что есть только один экземпляр, который описывает строку.Чтобы гарантировать, что существует только один экземпляр, System.Type был определен как абстрактный, поэтому его нельзя создать с помощью пользовательского кода, а System.RuntimeType был определен как внутренний, поэтому он доступен только для кода в mscorlib и также не может быть создан с помощью пользовательского кода.
3.
Существование System.RuntimeType - это деталь реализации, которая в большинстве случаев может игнорироваться.В любом случае ваш код может предполагать, что GetType возвращает экземпляр System.Type.Единственное исключение - следующий код (вы можете заменить строку любым другим типом):
bool b =
typeof(string).GetType() == typeof(Type);
Если не знать о System.RuntimeType, можно предположить, что b будет true, поскольку предполагается, что GetType возвращает System.Type, который явно является значением выражения правой руки.Но поскольку левое значение на самом деле является System.RuntimeType, b равно false (System.Type и System.RuntimeType - это два разных типа, и поэтому они не равны).Это единственный случай, когда вам нужно знать System.RuntimeType, чтобы понять, почему код ведет себя так, как он.В любом другом случае не имеет значения, что GetType возвращает System.RuntimeType, и вы можете игнорировать его.
4.
Вот прямая ссылка на часть моего .NET онлайнкурс, который обсуждает информацию о типе времени выполнения (RTTI).Я не упоминаю System.RuntimeType, потому что, как я уже сказал, это деталь реализации, которую можно по большей части игнорировать.Но эта ссылка даст вам более глубокое понимание и более ясное понимание System.Type.
http://motti.me/tw
Надеюсь, это поможет!
Motti