In .Net (and other strongly typed, static languages) once an instance of a class in instantiated you cannot change that instance to be a different type.
The only way to 'change types' is to assign a different instance of a compatible type to the variable (if the variable will accept types implementing Foo and types Foo1 and Foo2 both implement/extend Foo then an instance of either can be assigned to the variable
If you wish to maintain some state in this transition you can either define a common way for one instance of an object to copy all relevant values from another compatible instance (perhaps through reflection if the fields/properties are of the same type and name) or make it easy to share the sub sections via delegation, this is however a dangerous practice id the subsection types are not immutable unless your design is structured to never care.
Your question sounds suspiciously like you would like to have the following:
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;}
}
Were the existence of X/Y on FooWithAddOn was dynamic.
There are two ways to achieve this, one possible now, but limited to UI interactions based on reflection using things like ITypedList.
The other is much more powerful but is based on the c# 4.0 feature of dynamic dispatch, where the names of methods/properties are worked out at runtime.
If you are just interaction with the UI via something like a PropertyGrid then the first approach will work so long as, every time you 'list' of properties changes you rebuild the property grid, the latter will work in code perfectly but, for UI code, you will need to write a wrapper capable of doing much of what the ITypedList does to expose the current 'fake properties' to the reflective UI.