Как изменить тип объекта, а затем использовать методы из класса? - PullRequest
0 голосов
/ 21 ноября 2011
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, а затем переопределить его тип в зависимости от типа объекта, по которому щелкают.

Когда я пытаюсь это сделать, я получаю это сообщение об ошибке:

Ошибка 2: «объект» не содержит определения для «setPosition», и метод расширения «setPosition», принимающий первый аргумент типа «объект», не найден (вам не хватает директивы using или ссылки на сборку?)

Как мне понять, что selectedObject изменил тип?

Ответы [ 4 ]

6 голосов
/ 21 ноября 2011

Вы не можете «изменить тип» объекта, но это не похоже на то, что вы хотите сделать. Похоже, у вас есть значение определенного типа, которое содержится в переменной типа 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); 
1 голос
/ 21 ноября 2011

Я предполагаю, что вы заранее знаете, на какой тип (= класс 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 голосов
/ 21 ноября 2011

Проблема в том, что ваш код не будет компилироваться, потому что даже если вы знаете, 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 для его создания.

0 голосов
/ 21 ноября 2011

Вы не можете сделать это в C #.Smalltalk имеет эту функцию (становится), но она очень необычна.

Что вы делаете, это создаете новый экземпляр в ChangeObjectType, а локальный параметр selectedObject указывает на этот новый экземпляр.Локальная переменная в BuoyToMouse по-прежнему указывает на исходный экземпляр.

Она может работать при использовании ref в качестве ключевого слова для параметра, но тогда вам все равно придется приводить параметр после вызова сообщения дляновый тип.

...