В настоящее время я создаю объектную модель для сообщений HL7. Не вдаваясь в них, базовая структура, которая у нас есть, выглядит примерно так:
- Базовый объект
- Посредник Объект
- DeepMessage1
- DeepMessage2
- Сообщение1
- message2
Я хочу иметь глубокую копию / клон, который будет копировать все подобные свойства из DeepMessage1 в DeepMessage2 или Message1 или Message2.
public class BaseObject
{
PersonName Name; //A personName includes a first name and last name.
}
public class IntermediaryObject : BaseObject
{
Accident accident; //An accident codes and a description.
}
public class Message1 : BaseObject
{
//this class doesn't actually contain any special handling, just used for
//easy understanding for the API
}
public class Message2 : BaseObject
{
DateTime AdmissionDate; //Note the admission date is also contained in
//DeepMessage1, but not DeepMessage2
}
public class DeepMessage1 : IntermediaryObject
{
DateTime AdmissionDate; //Note this property is also contained in Message2 and
//needs to be copied
}
public class DeepMessage2 : IntermediaryObject
{
DateTime DischargeDate;
}
Учитывая эту структуру, я хочу иметь возможность создавать полную копию каждого свойства, которое один объект разделяет с другим. Этот другой вопрос был действительно хорошим началом, но в конечном итоге я не смог использовать отражение, так как это было мелкое клонирование, а для сериализации требуется точно такой же объект.
Я получил этот код, но он выполняет только поверхностную копию.
public T Copy<T>() where T : new()
{
T destination = new T();
if (destination is HL7Message)
{
foreach (var destinationProperty in destination.GetType().GetProperties())
{
foreach (var sourceProperty in this.GetType().GetProperties())
{
if (destinationProperty.Name.Equals(sourceProperty.Name))
{
destinationProperty.SetValue(destination, destinationProperty.GetValue(this, null), null);
}
}
}
return destination;
}
else
{
throw new InvalidOperationException("The destination copy type is not an HL7Message object");
}
}
Я надеялся, что в моем блоке if (destinationProperty.Name.Equals(sourceProperty.Name))
я смогу попытаться вызвать Copy для любых свойств, которые имеют определенный базовый тип (который расширяет все объекты в моей библиотеке). Однако я не смог заставить работать копию в этом разделе, так как не могу определить T во время выполнения.
Мне просто нужно иметь отдельный тип Копирования для конкретных объектов, и чтобы Сообщения использовали Копию, или есть способ сделать это, что чертовски безумно?