在.Net(以及其他強類型,靜態語言)中,一旦實例化了一個類的實例,則無法將該實例更改爲不同的類型。
的唯一方法「改變類型」是一個兼容類型的不同實例分配給可變(如果變量將接受實施Foo和類型Foo1和foo2的都實現類型/延伸的Foo然後一個實例可以分配給變量
如果您希望在此轉換中保留一些狀態,您可以爲一個對象的一個實例定義一個通用方法,以從另一個兼容實例中複製所有相關值(可能通過反射if字段/屬性具有相同的類型和名稱),或者通過委託共享子部分變得容易,但是這是一種危險的做法,除非你的設計被構造爲不關心,否則n類型不是不可改變的。
你的問題可疑聽起來像是你將喜歡有以下幾點:
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之類的反射的UI交互。 另一個更強大,但基於動態分派的c#4.0功能,其中方法/屬性的名稱在運行時計算出來。
如果你只是通過類似PropertyGrid的UI進行交互,那麼第一種方法將工作,只要每次你「屬性列表」更改你重建屬性網格,後者將完美的代碼工作,但是對於UI代碼,您需要編寫一個封裝程序,該封裝程序能夠完成ITypedList所做的大量工作,以將當前的「虛假屬性」暴露給反射式用戶界面。
在你的榜樣,創建沒有做任何事情,除了在任何一個開關的情況下返回其輸入。 – Josh 2009-11-25 23:29:08
在第一個case語句中,它應該返回一個ExtendedClass類型的對象。第二,它應該返回一個MyBase類型的對象。 – Damovisa 2009-11-25 23:50:53
但是你是對的 - 你必須檢查實際的返回類型來解決這個問題。 – Damovisa 2009-11-25 23:52:43