繁体   English   中英

C#-如何更改对象的类型,然后使用类中的方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM