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

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

 System.RuntimeType:[First.Namespace.FirstClass] 

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

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

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

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

  • Почему TargetInvocationException рассматривается как неотображаемое средой IDE?
  • GetProperties () возвращает все свойства иерархии наследования интерфейса
  • Почему GetType возвращает System.Int32 вместо Nullable ?
  • C # общий список как получить тип T?
  • C # Получение значения парм с использованием отражения
  • Как получить общий тип во время выполнения?
  • Как вызвать метод суперclassа с использованием отражения Java
  • Используя .Net, как я могу определить, является ли тип Numeric ValueType?
  • Вызов универсального метода с аргументом типа, известным только во время выполнения
  • Как передать функцию в качестве параметра в C #?
  • Получить свойства и значения из неизвестного объекта
  • Давайте будем гением компьютера.