В чем разница между System.Type и System.RuntimeType в C #? - PullRequest
73 голосов
/ 21 апреля 2011

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

System.RuntimeType:[First.Namespace.FirstClass]

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

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

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

Ответы [ 4 ]

90 голосов
/ 21 апреля 2011

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() для типа, который вы уже получили.

3 голосов
/ 21 апреля 2011

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

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

1 голос
/ 28 февраля 2016

Вкратце ...

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

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

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

0 голосов
/ 21 апреля 2011

Взгляните на этот блог, парень рассказывает о разнице.Мне кажется, эти классы являются результатом оптимизации .NET:

http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...