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类型的Object,然后根据单击的Object类型重新定义它的类型。
当我尝试这个时,我收到此错误消息:
错误2'对象'不包含'setPosition'的定义,也没有扩展方法'setPosition'接受类型'object'的第一个参数(你是否缺少using指令或汇编引用?)< / p>
如何理解selectedObject
已更改类型?
答案 0 :(得分: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);
答案 1 :(得分: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;
}
答案 2 :(得分:0)
你不能在C#中这样做。 Smalltalk具有此功能(成为),但这种情况非常罕见。
您正在做的是在ChangeObjectType
中创建一个新实例,并且本地参数selectedObject
指向此新实例。 BuoyToMouse
中的局部变量仍然指向原始实例。
使用ref
作为参数的关键字时可以正常工作,但是在消息调用新类型后仍然需要转换参数。
答案 3 :(得分:0)
问题是你的代码无法编译,因为即使你知道Buoy
确实有一个setPosition
方法,你作为一个对象采取行动的事实甚至不应该让你编译
您要做的只是先将其转换为类型。
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);
}
注意,这不是“更改”任何类型,您正在创建Buoy类的新实例并使用Activator为您实例化。