2012-11-16 1 views
2

다른 클래스를 할당 할 수있는 객체가 있습니다. 객체의 유형에 관계없이 액세스해야하는 필드가 모두 Position입니다. Visual Studio는 objectPosition 필드가 없기 때문에 var pos = myObject.Position을 컴파일하도록 허용하지 않습니다. 변수에 할당 된 다른 여러 클래스가있을 수 있으므로 MyClass으로 캐스트 할 수 없습니다.'object'의 특정 필드에 액세스하려면 어떻게해야합니까? 여러 유형 일 수있는 경우 한 유형으로 변환하지 않습니까?

한 유형으로 전송하지 않고 Position 필드에 액세스하려면 어떻게해야합니까?

답변

4

가장 좋은 방법은 모든 클래스를 공용 인터페이스로 구현 한 다음 해당 인터페이스를 사용하여 속성에 액세스하는 것입니다.

그러나 이들이 제어 할 수없는 클래스 인 경우 다른 옵션이 있습니다. 런타임에서는 느리기는하지만 Reflection을 사용하여 필드/속성 (Type.GetFieldFieldInfo.GetValue 등을 통해)에 액세스 할 수 있습니다.

나중에 C# 4 이상을 사용하는 경우에는 dynamic를 사용할 수 있습니다

dynamic theObject = yourObject; 
Point position = theObject.Position; 

이 당신의 유형에 Position 속성 또는 필드를 찾을 동적 바인딩 (런타임)를 사용합니다.

+0

다이내믹 한 문제가 해결되었습니다. 단지 작동시키기 위해'Microsoft.CSharp 사용하기 '를 추가해야했습니다. – user1306322

+0

디버깅 중에 디버깅하는 동안 '동적 인'을 사용하여 코드를 편집하는 것을 금하고 있지만, 나는 이것을 피하기 위해 인터페이스를 시도 할 것입니다. – user1306322

+0

@ user1306322 동적으로 편집하고 계속 작동하지 않습니다 - 그렇기 때문에 공통 인터페이스를 사용하는 것이 가장 좋은 접근 방식 (첫 번째 문장)임을 명시한 이유는 무엇입니까?하지만 접근 방식은 정상적으로 작동합니다. –

0

일단 다른 클래스를 모두 Position을 정의하는 클래스에서 상속받는 경우 개체를 부모 클래스 형식으로 참조하면 해당 형식을 알지 못해 정의 된 속성에 액세스 할 수 있습니다 .

많은 공통 기능이 없다면 아주 좋은 방법이 아닐 수 있습니다.

+0

내 생각에 그들은 부모 클래스가 이미 있습니다. – user1306322

+0

@ user1306322 Reed의 접근 방식을 사용합니다. – evanmcdonnal

1

Position 필드를 가진 모든 다른 클래스는 공용 기본 클래스에서 해당 필드를 상속하거나 공용 인터페이스에서 해당 필드를 가져와야합니다.

interface IHasPosition 
{ 
    int Position { get; } 
} 

다음의 모든 클래스는 : IHasPosition을 말할 것이다, 당신의 myObject 변수는 코드를 입력 IHasPosition의 선언해야합니다 :

인터페이스 솔루션은 다음과 같이 나타납니다.

관련 문제