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

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

 System.RuntimeType:[First.Namespace.FirstClass] 

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

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

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

4 Solutions collect form web for “В чем разница между System.Type и System.RuntimeType в C #?”

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

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

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

Из ответа на Различие между System.Type и System.RuntimeType Томасом Данеккером :

System.Type – абстрактный базовый class. 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.

Вкратце…

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

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

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

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

  • Как получить имя переменной с помощью отражения?
  • C # reflection - загрузить сборку и вызвать метод, если он существует
  • Установка свойства путем отражения со строковым значением
  • Как я могу оценивать выражение C # динамически?
  • Создание classа из строки и создание экземпляра в Scala 2.10
  • Как получить имена параметров метода в Java 8 с использованием отражения?
  • Быстрое создание объектов вместо Activator.CreateInstance (type)
  • Найдите личное поле с Reflection?
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • ClassCastException при литье в один class
  • Получение типа classа из строки
  • Interesting Posts
    Давайте будем гением компьютера.