2012-07-06 5 views
2

이 메서드가 포함 된 프로젝트를 컴파일하려고합니다.기본 유형으로 캐스팅하고 매개 변수로 사용 하시겠습니까?

public void Send<T>(object o) where T : struct { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write((T)o); 
} 

나는이 방법 (작업 중)에서 영감을 얻었다.

public static T Cast<T>(object o) { 
    return (T)o; 
} 

BinaryWriter.Write 함수는 매개 변수의 기본 형식을 지원하므로이 형식을 사용할 수 있다고 생각했습니다. 그러나 Visual Studio에서 ""System.IO.BinaryWriter.Write (bool)에 가장 적합한 오버로드 된 메서드가 잘못된 인수를 가지고 있습니다. "

모든 기본 유형을 포함하는 긴 switch 문을 쓰는 것을 피하려고합니다. 유형을 선택하기위한 메소드에 매개 변수를 추가하십시오. 이것은 추악하고 옳지 않은 것처럼 보입니다.

이 소쇄이다

  • 가 < INT> (123)에 전송;
  • 보내기 < bool> (true);

하지만 왜 작동하지 않습니까? 그리고 그것을하는 올바른 방법은 무엇입니까?

+0

그걸로 무엇을하려고합니까? [serialization concept] (http://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.71).aspx)에 익숙합니까, 아마도 그건 당신이 시도 할 수있는 다른 접근법입니다. – danielQ

답변

3

오버로드 해상도는 에서 컴파일 시간은입니다. 따라서 컴파일러는 어떤 유형의 어떤 유효한 매개 변수를 가진 메소드를 찾기 위해 노력하고 있습니다. (제약 조건 내에서, 여기서는 도움이되지 않습니다.) T입니다. 그런 방법을 찾을 수 없습니다. 유일한 제약 조건이 T이 구조체 여야한다는 것을 감안할 때, 비 제너릭 매개 변수 유형이 object (복싱을 통해) 일 것입니다.

당신의 목표는 개체의 실행 시간 유형에 따라 적절한이었다 중 과부하 사용했다면,이 같은 동적 입력을 사용하거나해야합니다 :

public void Send(dynamic d) { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write(d); 
} 

... 리플렉션 (동적 타이핑이하는 일종의 일종)과 함께 올바른 오버로드를 가져 와서 실행하십시오.

+0

나는 "동적 인"키워드에 익숙하지 않지만 작동하는 것 같다 : 나는 그것에 대해 읽을 것이다, 고마워. –

관련 문제