C# - 如何更改Object的类型然后使用Class中的方法?

时间:2011-11-21 16:41:31

标签: c# object typeof

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已更改类型?

4 个答案:

答案 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为您实例化。