#reflection #model #kephas
#отражение #Модель #kephas
Вопрос:
Мое требование — использовать какую-то систему метаданных для объектов, которые мы используем, но расширяемую, что означает, что нам нужно поддерживать какие-то пользовательские метаданные дополнительно к запросам свойств и методов. Стандартные классы Type / TypeInfo в некоторой степени полезны, но их нельзя настроить для добавления определенных свойств для поддержки различных имеющихся у нас шаблонов: узлов дерева, master-detail и других.
Kephas.Модель предоставляет сложную инфраструктуру для поддержки таких случаев, включая расширенные функции, такие как микширование и измерения, но это, однако, немного чересчур для нашей системы. Нам нужно что-то более легкое для объектов, основанных на коде, которые у нас есть.
Есть ли предложения о том, что мы можем использовать для такого рода требований? Я обратил внимание на Kephas.Пространство имен Reflection, и это кажется подходящим кандидатом, но я не уверен, как его правильно использовать.
Ответ №1:
Правильно, Kephas.Runtime
пространство имен предоставляет облегченные расширяемые метаданные через базовый IRuntimeTypeInfo
интерфейс (в Kephas.Core
пакете). В основном существует два способа доступа к нему с использованием методов расширения:
// get the type information from an object/instance.
var typeInfo = obj.GetRuntimeTypeInfo();
// convert a Type/TypeInfo to a IRuntimeTypeInfo
typeInfo = type.AsRuntimeTypeInfo();
С этого момента вы можете манипулировать свойствами, полями, методами, аннотациями (атрибутами) и так далее, Обычно индексируемыми по их именам. Очень приятной особенностью является то, что IRuntimeTypeInfo
это expando, позволяющий добавлять динамические значения во время выполнения.
Пожалуйста, обратите внимание, что он IRuntimeTypeInfo
специализируется ITypeInfo
(на Kephas.Reflection
пространстве имен), которое также является базовым интерфейсом в Kephas.Model
. Вы правы, что Kephas.Model
предоставляет более сложную функциональность, которая может иметь смысл для более сложной модели метаданных, включая сущности, сервисы, действия и любые классификаторы, о которых вы можете подумать, а также для загрузки модели также из источников, отличных от .Сетевое отражение (JSON, XML, база данных и так далее).
Другой аспект заключается в том, что до версии 5.2.0 IRuntimeTypeInfo
будет реализован с помощью класса sealed RuntimeTypeInfo
. Начиная с версии 5.3.0, можно будет предоставлять свои собственные реализации, которых может быть несколько.