[英]C# - How do I change an Object's type and then use methods from the Class?
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'object'不包含'setPosition'的定义,找不到扩展方法'setPosition'接受类型为'object'的第一个参数(您是否缺少using指令或程序集引用?)
如何使其了解selectedObject
已更改类型?
您不能“更改对象的类型”,但这听起来并不像您想要做的那样。 听起来您具有某个类型的值,该值保存在type object
的变量中。
在这种情况下,您可以使用“ cast”告诉编译器您的值的实际类型是什么:
((Buoy)selectedObject).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y);
(selectedObject as Buoy).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y);
我假设您事先知道可以单击哪种对象(= 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;
}
问题是您的代码无法编译,因为即使您知道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为您实例化它。
您无法在C#中执行此操作。 Smalltalk具有此功能(成为),但很少见。
您正在做的是在ChangeObjectType
创建一个新实例,并且本地参数selectedObject
指向该新实例。 BuoyToMouse
的局部变量仍指向原始实例。
当使用ref
作为参数的关键字时,它可能会起作用,但随后您仍然需要在对新类型的消息调用之后强制转换参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.