По моему, они имеют похожее назначение и очень похожи между собой.
В чем практическая разница? И когда что лучше использовать?
Как я понимаю- это какая-то удобная оболочка над Type и в свежих версиях фреймворка лучше использовать TypeInfo?
В некоторых источниках пишут, что Type содержит поверхностные данные. Однако, что под этим подразумевается? Я из Type по прежнему могу полуить список полей и методов и т п.
Из MSDN
A TypeInfo object represents the type definition itself, whereas a Type object represents a reference to the type definition. Getting a TypeInfo object forces the assembly that contains that type to load. In comparison, you can manipulate Type objects without necessarily requiring the runtime to load the assembly they reference.
Объект TypeInfo представляет определение типа, в то время как объект Type представляет ссылку на определение типа. Получение объекта TypeInfo приводит к принудительной загрузке сборки, содержащей этот тип. Для сравнения, можно управлять объектами Type без необходимости загрузки сборок, на которые они ссылаются.
Данный тип появился в результате рефакторинга. Он предоставляет ряд методов и свойств-помощников, которые используются для получения информации только о тех членах, которые объявлены внутри этого типа, без учёта наследования. Все эти данные вы можете получить и через Type, используя BindingFlags.DeclaredOnly
public virtual IEnumerable<ConstructorInfo> DeclaredConstructors
public virtual IEnumerable<EventInfo> DeclaredEvents
public virtual IEnumerable<FieldInfo> DeclaredFields
public virtual IEnumerable<MemberInfo> DeclaredMembers
public virtual IEnumerable<MethodInfo> DeclaredMethods
public virtual IEnumerable<System.Reflection.TypeInfo> DeclaredNestedTypes
public virtual IEnumerable<PropertyInfo> DeclaredProperties
public virtual IEnumerable<Type> ImplementedInterfaces
public virtual EventInfo GetDeclaredEvent(String name)
public virtual FieldInfo GetDeclaredField(String name)
public virtual MethodInfo GetDeclaredMethod(String name)
public virtual IEnumerable<MethodInfo> GetDeclaredMethods(String name)
public virtual System.Reflection.TypeInfo GetDeclaredNestedType(String name)
public virtual PropertyInfo GetDeclaredProperty(String name)
Данные методы не содержат какой-либо специальной логики и являются обёртками над существующими в Type, поэтому архитектурно было бы неправильно тащить их в новый DelayLoadType. Отчасти поэтому иерархия типов была разделена. DelayLoadType стал наследником Type, а все остальные реализации наследуются от TypeInfo, а уж он в свою очередь - от Type. Всё, что вы можете сделать через Type, вы можете сделать через TypeInfo и наоборот.
В .NET Core 1.0-1.1 часть функциональности из класса Type перенесли в TypeInfo. Соответственно, и .NET Standart как общее подмножество также не имеет этой функциональности в классе Type.
Для совместимости в .NET Framework TypeInfo тоже добавили - но если вы используете только .NET Framework и не собираетесь никуда переезжать - этот класс вам не нужен; можно и дальше везде использовать Type.
А вот если вы пишите для .NET Core 1.0-1.1 или переносимую библиотеку для .NET Standart ниже 2.0 - у вас просто не получится использовать Type так, как вы привыкли - там осталось совсем немного методов. Часть кода придется переписать на использование TypeInfo.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости