2009-09-17 6 views
3

컴파일 타임에 알지 못하는 형식으로 개체를 캐스팅하는 방법이 필요합니다. 이 같은동적 캐스팅?

뭔가 :

object obj; 

public (type of obj) Obj 
{ 
    get 
    { 
     return obj 
    } 
    set 
    { 
     obj = (type of obj)value; 
    } 
} 

알고있는 유일한 것은 obj가 값 형식 것입니다.

나는 이와 같은 것이 가능할 것이라고 생각하지 않습니다. 누군가가 그것을하는 영리한 방법이 있는지 확인하기 만하면됩니다.

+2

제네릭 ?T – Gishu

+0

과 같은 인덱서와 같은 메소드를 정의합니다. 내가하려는 일을보다 명확하게하기 위해 코드를 편집했습니다. – remdao

+0

예제에서 캐스트는 설정자에 있지만 getter에서는 더 적합합니다. – Thorarin

답변

6

이것은 C# 3.0에서는 가능하지 않지만 모든 개체가 구현하는 공통 인터페이스를 정의 할 수 있다면이를 캐스팅 할 수 있습니다.

C# 4.0에서는 Duck Typing을 허용하는 dynamic 키워드를 얻을 수 있습니다.

+0

여러 프로젝트에서 이러한 시나리오에 맞서기 위해 공통 인터페이스를 사용하는 것이 최선의 방법이라고 생각합니다. 유형에 따라 기능에 액세스하는 것은 스위치 또는 일부 유형의 선택기가있는쪽으로 향하게 될 것입니다. (처음부터 유형 캐스팅을하지 않는 이유는 무엇입니까?) 결국, 알 수없는 경우 어떻게 알게 될까요? 한 번 캐스팅 된 것은 무엇입니까? 이것이 플러그인과 같은 일종의 exec의 일부인 경우 리플렉션을 사용하고 메서드와 속성에 액세스하면 캐스팅의 필요성이 제거되므로 느슨하게 결합됩니다. 이 모든 것이 무엇을 필요로하는지에 따라 달라질 수 있습니다. – samiq

4

이러한 캐스트는 실제로 아무 것도하지 않습니다. 다시 입력 할 때 더 느린 형식의 변수에 할당하기 때문입니다. 최선의 접근 방식은 값 유형을 "형변환"한 후에 수행하려는 작업에 따라 다릅니다.

옵션은 다음과 같습니다

  • 반사
  • C# 4.0 dynamic 입력합니다.
  • 가변 유형에 기초한 간단한 switch 또는 if .. else.

편집 : 당신이 컴파일시에 유형에 대해 아무것도 몰라,하지만 예는 클래스의 실제 사용을 설명하지 않는 경우가 내가 될 수 있도록 실제로 문제가 해결되지 않는 일반적인 클래스를 사용하여 너의 의도를 오해하고있어. 이 같은 것이 실제로 원하는 것일 수 있습니다.

실제 유형 정의가 제네릭 형식 매개 변수가되었습니다. 엄밀히 말하자면, 컴파일 타임에 알려진 형식은 여전히 ​​정적입니다.

4

글쎄, 당신은 제네릭이 할 수 있습니다 :

public class IAcceptValueTypes<T> where T: struct 

private T obj; 

public T Obj 
{ 
    get { return obj; } 
    set { obj = value; } 
} 

일반 제약 where T: struct 값 유형에 허용되는 유형을 제한합니다.

+0

+1 올바른 접근! – nawfal

1

왜 이런 종류의 캐스팅이 필요합니까?

  1. 유형 수가 제한되어있는 경우 등록 정보의 일반 버전을 구현할 수 있습니다.
  2. 리플렉션을 사용하여 전달 된 객체의 유형을 이해하고이 유형에 캐스트 할 수 있습니다.
1

나는 현재 사용해 내 앞에 비주얼 스튜디오가 없지만 그렇지 않은 이유를 찾아 볼 :

  • GetType을
  • Convert.ChangeType을