Копирование свойств из одного универсального класса в другой через преобразователь значений. ⇐ C#
Копирование свойств из одного универсального класса в другой через преобразователь значений.
В моем приложении C# у меня есть класс, который действует как структура данных для хранения различных категорий, которые могут содержать подкатегории или списки категорий, которые в конечном итоге содержат свойства данных, содержащие значения и другие связанные данные.
Класс DataStructure является универсальным, поскольку он используется в нескольких местах приложения либо напрямую, либо в качестве базового класса для расширений, а тип значений в DataProperty будет отличаться в каждом случае использования. В какой-то момент мне нужно передать значения из экземпляра DataStructure одного типа в экземпляр DataStructure другого типа. Например, если первый DataStructure имел тип string, а второй имел тип double, преобразователь преобразует значение каждого DataProperty с помощью специальной логики. Любые списки категорий также необходимо заполнить во втором DataStructure, чтобы все соответствовало первому DataStructure.
По сути, мне нужно сделать копию экземпляра DataStructure, но с другим типом, преобразуя значения с помощью специального преобразователя. Это также должно работать, если вторая структура данных является экземпляром класса, производного от DataStructure. Это упрощенная версия кода, показывающая настройку:
static void Main(string[] args) { DataStructure dataStructureStr = new(); FillData(dataStructureStr); //Заполняет списки категорий, записывает некоторые значения строкового типа в свойства DataProperty DataStructure dataStructureDbl = new(); ConvertAndCopyData (dataStructureStr, dataStructureDbl); //Переносит значения всех свойств из одной DataStructure в другую с помощью конвертера } открытый интерфейс ICategory { //... } публичный абстрактный класс Категория: ICategory { //... } общедоступный класс DataProperty { общественное значение T {get; набор; } //... } общедоступный класс DataStructure { общественная среда EnvironmentData Environment {получить; в этом; } = новый(); общедоступный класс EnvironmentData: Категория { общественный LightData Light {получить; в этом; } = новый(); public List Forces {get; в этом; } = новый(); общедоступный класс LightData: Категория { общественный LightPositionData LightPosition {получить; в этом; } = новый(); public DataProperty Intensity {get; в этом; } = новый(); общедоступный класс LightPositionData: Категория { public DataProperty OriginCoordsXYZ {get; в этом; } = новый(); public DataProperty TargetCoordsXYZ {get; в этом; } = новый(); } } общественный класс Force: Категория { public DataProperty Величина {get; в этом; } = новый(); } } //... } Хотя функцию ConvertAndCopyData можно реализовать путем явного обращения к каждой категории, подкатегории и свойству данных, мне потребуется, по сути, еще раз напечатать всю структуру и поддерживать эту функцию вручную, если Я меняю что-нибудь в исходном DataStructure. DataStructure в моем реальном приложении гораздо более обширен, что делает этот подход непрактичным.
Я надеюсь, что этого можно достичь путем размышления, поскольку производительность здесь не имеет решающего значения. Но я понятия не имею, как это сделать. Кто-нибудь может посоветовать?
В моем приложении C# у меня есть класс, который действует как структура данных для хранения различных категорий, которые могут содержать подкатегории или списки категорий, которые в конечном итоге содержат свойства данных, содержащие значения и другие связанные данные.
Класс DataStructure является универсальным, поскольку он используется в нескольких местах приложения либо напрямую, либо в качестве базового класса для расширений, а тип значений в DataProperty будет отличаться в каждом случае использования. В какой-то момент мне нужно передать значения из экземпляра DataStructure одного типа в экземпляр DataStructure другого типа. Например, если первый DataStructure имел тип string, а второй имел тип double, преобразователь преобразует значение каждого DataProperty с помощью специальной логики. Любые списки категорий также необходимо заполнить во втором DataStructure, чтобы все соответствовало первому DataStructure.
По сути, мне нужно сделать копию экземпляра DataStructure, но с другим типом, преобразуя значения с помощью специального преобразователя. Это также должно работать, если вторая структура данных является экземпляром класса, производного от DataStructure. Это упрощенная версия кода, показывающая настройку:
static void Main(string[] args) { DataStructure dataStructureStr = new(); FillData(dataStructureStr); //Заполняет списки категорий, записывает некоторые значения строкового типа в свойства DataProperty DataStructure dataStructureDbl = new(); ConvertAndCopyData (dataStructureStr, dataStructureDbl); //Переносит значения всех свойств из одной DataStructure в другую с помощью конвертера } открытый интерфейс ICategory { //... } публичный абстрактный класс Категория: ICategory { //... } общедоступный класс DataProperty { общественное значение T {get; набор; } //... } общедоступный класс DataStructure { общественная среда EnvironmentData Environment {получить; в этом; } = новый(); общедоступный класс EnvironmentData: Категория { общественный LightData Light {получить; в этом; } = новый(); public List Forces {get; в этом; } = новый(); общедоступный класс LightData: Категория { общественный LightPositionData LightPosition {получить; в этом; } = новый(); public DataProperty Intensity {get; в этом; } = новый(); общедоступный класс LightPositionData: Категория { public DataProperty OriginCoordsXYZ {get; в этом; } = новый(); public DataProperty TargetCoordsXYZ {get; в этом; } = новый(); } } общественный класс Force: Категория { public DataProperty Величина {get; в этом; } = новый(); } } //... } Хотя функцию ConvertAndCopyData можно реализовать путем явного обращения к каждой категории, подкатегории и свойству данных, мне потребуется, по сути, еще раз напечатать всю структуру и поддерживать эту функцию вручную, если Я меняю что-нибудь в исходном DataStructure. DataStructure в моем реальном приложении гораздо более обширен, что делает этот подход непрактичным.
Я надеюсь, что этого можно достичь путем размышления, поскольку производительность здесь не имеет решающего значения. Но я понятия не имею, как это сделать. Кто-нибудь может посоветовать?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение