Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

В чем разница между Type и TypeInfo?

#c_sharp #net


По моему, они имеют похожее назначение и очень похожи между собой.

В чем практическая разница? И когда что лучше использовать?

Как я понимаю- это какая-то удобная оболочка над Type и в свежих версиях фреймворка
лучше использовать TypeInfo?

В некоторых источниках пишут, что Type содержит поверхностные данные. Однако, что
под этим подразумевается? Я из Type по прежнему могу полуить список полей и методов и т п.
    


Ответы

Ответ 1



Из 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 без необходимости загрузки сборок, на которые они ссылаются.

Ответ 2



Данный тип появился в результате рефакторинга. Он предоставляет ряд методов и свойств-помощников, которые используются для получения информации только о тех членах, которые объявлены внутри этого типа, без учёта наследования. Все эти данные вы можете получить и через Type, используя BindingFlags.DeclaredOnly public virtual IEnumerable DeclaredConstructors public virtual IEnumerable DeclaredEvents public virtual IEnumerable DeclaredFields public virtual IEnumerable DeclaredMembers public virtual IEnumerable DeclaredMethods public virtual IEnumerable DeclaredNestedTypes public virtual IEnumerable DeclaredProperties public virtual IEnumerable ImplementedInterfaces public virtual EventInfo GetDeclaredEvent(String name) public virtual FieldInfo GetDeclaredField(String name) public virtual MethodInfo GetDeclaredMethod(String name) public virtual IEnumerable 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 и наоборот.

Ответ 3



В .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.

Комментариев нет:

Отправить комментарий