2011-11-21 2 views
0
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 '에 대한 정의를 포함하지 않는 수C# - 개체의 형식을 변경 한 다음 클래스의 메서드를 사용하려면 어떻게해야합니까?

오류 :이 때

는이 오류 메시지가 찾았습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?)

selectedObject이 유형을 변경했다는 것을 어떻게 이해합니까?

답변

6

당신은 객체의 "유형을 변경할 수 없습니다"를,하지만 당신이 원하는 무엇을 같은 소리하지 않습니다. object 유형의 변수에 보유 된 특정 유형의 값을 가진 것처럼 들립니다.

는 경우에, 당신은 당신의 가치의 실제 유형은 "캐스트"를 사용하고 어떤 컴파일러를 알 수 있습니다 : 당신은 C#에서이 작업을 수행 할 수

((Buoy)selectedObject).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y); 

(selectedObject as Buoy).setPosition(mouseCurrentState.X - mouseStart.X, mouseCurrentState.Y - mouseStart.Y); 
+0

고맙습니다. 전에 (부표) selectedObject로 캐스팅을 시도했지만 주위에 대괄호를 넣지 않았다고 생각했습니다. #우둔한 – RichardG

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; 
} 
+0

예 클릭 할 수있는 유형은 몇 가지뿐입니다. – RichardG

0

. 스몰 토크 (Smalltalk)는이 기능을 갖추고 있지만 매우 드문 경우입니다.

ChangeObjectType에 새 인스턴스를 만들고이 새 인스턴스를 로컬 매개 변수 selectedObject이 가리키는 것입니다. 로컬 변수 BuoyToMouse은 여전히 ​​원래 인스턴스를 가리 킵니다.

매개 변수 키워드로 ref을 사용하면 작동하지만 새 유형으로 메시지를 호출 한 후에도 매개 변수를 전송해야합니다.

0

Buoy이 실제로 메서드를 가지고 있음에도 불구하고 코드를 컴파일하지 않아도된다는 사실은 컴파일 할 수 있도록해서는 안됩니다.

당신이하고 싶은 것은 그냥 먼저 유형으로 캐스팅하는 것입니다.

internal void BuoyToMouse() 
{ 
    object selectedObject; 
    ChangeObjectType(typeof(Buoy), ref selectedObject); 
    ((Buoy)selectedObject).setPosition(... 
} 

당신은 또한 참고로 심판 키워드를

public void ChangeObjectType(System.Type objectType, ref Object selectedObject) 
{ 
    selectedObject = Activator.CreateInstance(objectType); 
} 

을 사용하기를 원할 것입니다, 이것은 어떤 종류의, 당신은 부표 클래스의 새 인스턴스를 만들고에 활성제를 사용하는 "변화"아니다 그것을 당신을 위해 인스턴스화하십시오.

관련 문제