Недопустимо присваивать Base
ссылку на класс на Derived
переменную ссылки на класс.
Переменная типа X
может быть только ссылкой на объект типа X
или производным.
Возможно, вам нужен еще один экземпляр SpecialContact
, который содержит те же данные, что и существующий объект. Нет способа избежать ручного копирования.
Я использую следующий метод расширения, когда мне нужно скопировать совпадающие свойства из одного несовместимого объекта в другой (1):
public static void AssignFrom(this object destination, object source) {
Type dest_type = destination.GetType();
Type source_type = source.GetType();
var matching_props = from d in dest_type.GetProperties()
join s in source_type.GetProperties()
on d.Name equals s.Name
where d.IsWritable() && s.IsReadable()
select new {
source = s,
destination = d
};
foreach (var prop in matching_props) {
prop.destination.SetValue(destination, prop.source.GetValue(source, null), null);
}
}
Тогда вы можете сделать:
specialContact.assignFrom(contact);
Пожалуйста, рассмотрите это как обходной путь. Правильным решением будет правильно спроектировать иерархию классов, в которой вы не решите эту проблему.
1 Примечание: сопоставляет свойства по имени и предполагает, что они относятся к одному типу.