В .Net (и других строго типизированных статических языках), если экземпляр экземпляра класса создан, вы не можете изменить этот экземпляр на другой тип.
Единственный способ «изменить типы» - назначить другой экземпляр совместимого типа переменной (если переменная будет принимать типы, реализующие Foo, и типы Foo1 и Foo2, оба реализуют / расширяют Foo, тогда экземпляр любого из них может быть назначен переменной
Если вы хотите сохранить некоторое состояние в этом переходе, вы можете либо определить общий способ для одного экземпляра объекта скопировать все соответствующие значения из другого совместимого экземпляра (возможно, с помощью отражения, если поля / свойства имеют одинаковый тип и имя) или упрощают совместное использование подразделов с помощью делегирования, однако это опасная практика, поскольку типы подразделов не являются неизменными, если ваш дизайн не имеет структуры.
Ваш вопрос звучит подозрительно, как если бы вы хотели иметь следующее:
class FooWithAdOns
{
int Blah { get; set;}
int Wibble { get; set }
Type AddOn { get; set; }
/* if AddOn type is AddOnX */
int X { get; set; }
/* if AddOn type is AddOnY */
int Y { get; set; }
}
class AddOnX
{
int X { get; set;}
}
class AddOnY
{
int Y { get; set;}
}
Было ли существование X / Y на FooWithAddOn динамическим.
Есть два способа достичь этого, один возможный сейчас, но ограниченный взаимодействиями пользовательского интерфейса, основанными на отражении, с использованием таких вещей, как ITypedList .
Другой гораздо более мощный, но основан на функции динамической диспетчеризации c # 4.0, где имена методов / свойств вырабатываются во время выполнения.
Если вы просто взаимодействуете с пользовательским интерфейсом через что-то вроде PropertyGrid, тогда первый подход будет работать до тех пор, пока каждый раз, когда вы изменяете «список» свойств, вы перестраиваете сетку свойств, последний будет отлично работать в коде, но, для кода пользовательского интерфейса вам нужно написать оболочку, способную выполнять большую часть того, что делает ITypedList, чтобы предоставить текущие «поддельные свойства» отражающему пользовательскому интерфейсу.