2011-11-21 49 views
0
public void ChangeObjectType(System.Type objectType, Object selectedObject) 
{ 
    selectedObject = Activator.CreateInstance(objectType); 
} 

internal void BuoyToMouse() 
{ 
    ChangeObjectType(typeof(Buoy), selectedObject); 
    selectedObject.setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y); 
} 

我正在創建一個遊戲,我正在嘗試處理鼠標事件。我試圖使用一個Object類型的對象,然後根據被點擊的對象的類型重新定義它的類型。C# - 如何更改對象的類型,然後使用類的方法?

當我嘗試此我得到這個錯誤消息:

錯誤2「對象」不包含「的setPosition」和沒有擴展方法「的setPosition」接受型「對象」的第一個參數定義可能是發現(您是否缺少使用指令或裝配參考?)

我如何使它明白selectedObject已更改類型?

回答

6

你不能「改變類型」的對象,但聽起來並不像你想做些什麼。這聽起來像是你的某個類型的值被保存在object類型的變量中。

在這種情況下,你可以告訴編譯你的價值的實際類型是使用「鑄」:

((Buoy)selectedObject).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y); 

(selectedObject as Buoy).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y); 
+0

謝謝,我曾嘗試將它作爲(浮標)selectedObject之前,但我不認爲將括號括起來。 #啞 – RichardG

1

我假設你事先知道可以點擊哪些對象(= C#類),例如, A和B.然後在事件處理程序做這樣的事情:

var a = selectedObject as A; 
if (a != null) 
{ 
    ...call some method of "a", e.g. setPosition... 
    return; 
} 


var b = selectedObject as B; 
if (b != null) 
{ 
    ...call some method of "b", e.g. setPosition... 
    return; 
} 
+0

是的只有幾種可以點擊的類型。 – RichardG

0

在C#中你不能做到這一點。 Smalltalk有這個功能(成爲),但它是非常罕見的。

你正在做的是在ChangeObjectType中創建一個新實例,並且本地參數selectedObject指向這個新實例。 BuoyToMouse中的局部變量仍然指向原始實例。

當使用ref作爲參數的關鍵字時它可以工作,但是在消息調用新類型之後仍然需要轉換該參數。

0

問題是你的代碼不會編譯,因爲即使你知道Buoy確實有一個方法,你作爲一個對象行事的事實也不應該讓你編譯。

你想要做的只是先將它轉換爲類型。

internal void BuoyToMouse() 
{ 
    object selectedObject; 
    ChangeObjectType(typeof(Buoy), ref selectedObject); 
    ((Buoy)selectedObject).setPosition(... 
} 

你也將需要使用ref關鍵字

public void ChangeObjectType(System.Type objectType, ref Object selectedObject) 
{ 
    selectedObject = Activator.CreateInstance(objectType); 
} 

作爲一個說明,這是不是「改變」任何類型的,你所創建的浮標類的新實例,並用活化劑爲你實例化它。

相關問題