Какая разница между System.Type и System.RuntimeType в С#?

Я пытался выполнить некоторые тесты для тестирования сегодня и получать все типы в сборке (вызывая Assembly.GetTypes()), когда я наткнулся на что-то:

System.RuntimeType:[First.Namespace.FirstClass]

Всякий раз, когда я пытаюсь сравнить этот тип с typeof(FirstClass), они не равны. Поэтому, когда я пытаюсь найти все типы, содержащие FirstClass как общий параметр, я не нахожу.

В чем разница между System.RuntimeType и System.Type?

Есть ли способ решить мою проблему?

Ответ 1

System.RuntimeType - это конкретный класс, который вытекает из абстрактного базового класса System.Type. Поскольку System.RuntimeType не является общедоступным, вы, как правило, сталкиваетесь с его экземплярами как System.Type.

Путаница может возникнуть, когда вы пытаетесь получить тип объекта и ошибочно вызываете GetType() на другой объект, представляющий первый тип объекта, а не просто используя этот объект напрямую. Затем Type.ToString() вернет "System.RuntimeType", когда объект, на который он вызывается, представляет тип:

string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString();     // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"

Например, в этом сообщении в блоге кто-то пытается получить тип столбца в базе данных, делая что-то вроде этого:

object val = reader.GetFieldType(index);
Type runtimeType = val.GetType();
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
Type type = (Type)propInfo.GetValue(val, null);

Так как val уже является объектом Type, val.GetType() возвращает другой объект Type, представляющий тип System.RuntimeTime, поскольку это конкретный тип, используемый для представления исходного объекта типа. Сообщение в блоге затем показывает некоторую ненужную рефлекторную обманку, чтобы получить тип исходного объекта типа, когда действительно все, что требовалось, было:

Type type = reader.GetFieldType(index) as Type;

Итак, если ваш объект Type сообщает, что он представляет System.RuntimeType, убедитесь, что вы случайно не вызвали GetType() по типу, который у вас уже есть.

Ответ 2

Из ответа на Различия между System.Type и System.RuntimeType Thomas Danecker:

System.Type - абстрактный базовый класс. У CLR есть конкретные реализация во внутреннем типе System.RuntimeType. Из-за этого typeof (string).GetType() возвращает RuntimeType, но typeof (Type) возвращает обычный тип. Использование метода .Equals на самом деле является объектом .ReferenceEquals который возвращает false. Чтобы получить ожидая результатов, вы можете использовать type.IsInstanceOfType(элемент). Эта также вернет true, если элемент производный тип. Если вы хотите проверить для точного типа возвращаемое значение ложного метода. результат. Вы также можете использовать CheckType (arrayType, Type.GetType( "System.RuntimeType" )), чтобы проверьте для RuntimeType.

Ответ 4

Вкратце...

    "".GetType().ToString()           == "System.String"

    "".GetType().GetType().ToString() == "System.RuntimeType"

Теперь я думаю о том, что System.Type является базовым типом для типа, представляющего результаты запроса типа объекта во время выполнения, а именно System.RuntimeType. Итак, когда вы запрашиваете тип объекта, как в "".GetType(), возвращаемый экземпляр System.Type является потомком, System.RuntimeType. На самом деле, следует ожидать, что typeof(System.Type).GetType() должен быть System.RuntimeType, но я думаю, что структура специально предотвращает эту симметрию.