2012-05-31 52 views
5

我很確定這是以前問的,但不幸的是,我發現的唯一的東西是this這對我來說並不是解決方案。在我目前的項目我做這樣的事情:如何動態地投射物體?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

,因爲我還沒有投obj因爲它的類型是動態變化的此代碼不能當然的工作。

我該如何動態投射它?

+4

看來,這不會是最好的方式去做事情。一種代碼味道給我。你想要完成什麼更大的背景? – FishBasketGordo

+0

除了初始化它,你還打算用'obj'做什麼? –

+0

@RaymondChen我剛剛做了簡單的WinForm項目來測試我的類庫。 – Leri

回答

9

三個選項:

  • 如果您可以控制類,你可以讓他們實現一個共同的接口,其中包括你需要的一切,然後做到這一點 - 和強制轉換爲界面
  • 如果你使用C#4和.NET 4,您可以使用動態類型 - 只需將變量聲明爲private dynamic obj;,並且它將在執行時編譯並找到正確的方法
  • 否則,使用反射來查找和調用方法。

基本上鑄造基於執行時間類型沒有意義,鑄造點的部分是給編譯更多信息......你根本就沒有在這個案例。

第一種選擇是迄今爲止最好的,如果你可以實現它。

+1

依賴注入怎麼樣 –

+1

沒有接口的依賴注入/抽象基類?怎麼樣?如果可以定義接口,場景首先就足夠了 – Tilak

+0

與接口相反,基類不會更好嗎?這是* is-a *(抽象類),與* can-do *(接口)相反。假設類型在性質上類似 – mattytommo

0

我假設CreatInstanceB()實際上應該使用MyClassB,對嗎?

在這種情況下,你可以使用:

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

或者你可以把它有一個初始化方法的接口和定義的obj作爲接口。

+0

我認爲,在初始化方法中,MyClassA或MyClassB未知,這是問題中的要點 – Tilak

+0

是的,您是對的。我編輯了問題。建議使用@JonSkeet,最好使用'dynamic'關鍵字。 – Leri

+0

沒錯,錯過了。我們總可以依靠Skeet先生。 – Slugart