Создание клонированной копии подкласса из базового класса
Рассмотрим этот сценарий:
public class Base
{
public int i;
}
public class Sub : Base
{
public void foo() { /* do stuff */}
}
И тогда я хочу, учитывая случайBase
получить клонированный экземплярSub
(с i = 17 в этом случае), чтобы я мог позвонитьfoo
в подклассе.
Base b = new Base { i=17 };
Sub s = CloneAndUpcast(b);
s.foo();
Тем не менее, как я могу создатьCloneAndUpcast
?
Я думаю, что должно быть возможно рекурсивно клонировать всеBase
-члены и свойства с использованием отражения. Но довольно некоторая работа.
Кто-нибудь с лучшими, аккуратными идеями?
PS. Сценарий, в котором я думаю об использовании этого, представляет собой набор «простых» классов в древовидной структуре (здесь нет циклических графов или подобных), и все классы являются простыми держателями значений. План состоит в том, чтобы иметь тупой слой, содержащий все значения, а затем аналогичный набор классов (подклассов), который фактически содержит некоторую бизнес-логику, о которой владельцы значений не должны знать. Вообще плохая практика да. Я думаю, что это работает в этом случае.