Сегодня я пытался провести несколько тестов по соглашению и получить все типы в сборке (путем вызова Assembly.GetTypes()
), когда я наткнулся на что-то:
System.RuntimeType:[First.Namespace.FirstClass]
Всякий раз, когда я пытаюсь сравнить этот тип с typeof(FirstClass)
, они не равны. Итак, когда я пытаюсь найти все типы, содержащиеся FirstClass
в качестве универсального параметра, я их не нахожу.
В чем разница между System.RuntimeType
и System.Type
?
Есть ли способ решить мою проблему?
c#
reflection
Эдгар Гонсалес
источник
источник
Ответы:
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()
тип, который у вас уже есть.источник
Type
вернет true, даже если вы пройдетеtypeof(int)
. Второй фрагмент кода не подходит для сравненияtypeof(string).GetType()
иtypeof(Type)
.Из ответа Томаса Данекера на тему « Различия между System.Type и System.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
, но я думаю, что фреймворк специально предотвращает эту ... симметрию.источник
Взгляните на этот блог, парень рассказывает о разнице. Мне кажется, что эти классы являются результатом оптимизации .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
источник