2009-02-26 2 views
1

값 형식간에 값을 복사하는 일반 메서드가 있습니다. 다음 접근법은 구조체 제약 조건을 포함하여 설계 시간 오류를 제공합니다. 값 사이에서 복사 또는 캐스팅 할 수있는 방법은 무엇입니까?값 형식 제약 조건이있는 일반 선언 된 형식간에 복사하는 방법

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc SourceObject) 
    where Tsrc : struct 
    where Ttgt : struct 
{ 
    //Error:cannot implictly convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = SourceObject; 

    //Error:Cannot convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = (Ttgt)SourceObject; 

    return returnObject; 
} 

답변

3

당신이 트릭을 할 수있는 작은 반사 마법 사이의 변환하려는 유형에 대한 등록 된 형식 변환기가 있음을 감안할 때 :

같은 유형으로 모두 소스도 및 대상을 정의

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc sourceObject) 
    where Tsrc:struct where Ttgt:struct  
{  
    Type targetType = typeof(Ttgt); 
    TypeConverter tc = TypeDescriptor.GetConverter(targetType); 
    Ttgt returnObject = (Ttgt)tc.ConvertTo(sourceObject, targetType); 
    return returnObject;  
} 

하지만 bool과 int 사이에 변환기가 없기 때문에 상자 밖에서는 매우 제한적으로 사용됩니다. 어떤 문제를 해결하려고합니까?

또 다른 미친 변환 코드가 포함 된 question을 발견했습니다.

편집 : 귀하의 의견은 도메인 개체와 일종의보기/계약 모델 간의 개체 - 개체 매핑을 수행하려고한다는 것을 분명히합니다. AutoMapper을 보셨습니까?

+0

을 내가 재귀 객체에 객체 매퍼를 쓰고 :

private Ttgt MyMethod<Tsrc, Ttgt>(Tsrc SourceObject) where Tsrc : struct where Ttgt : struct { return (Ttgt) Convert.ChangeType(SourceObject, typeof(Ttgt)); } 

또한 이 작업을 수행 할 수 있습니다. WCF 구현의 기본 비즈니스 논리 클래스와 계약 클래스를 분리합니다. 구현 클래스는 계약과 거의 동일하지만이 두 클래스 사이에 종속성을 도입하고 싶지 않습니다. –

+0

다음과 같이 말합니다. Type targetType = typeof (Ttgt); –

+0

감사합니다. 올바른 변수 이름을 업데이트했습니다. – PHeiberg

1

//Error:Cannot convert type 'Tsrc' to 'Ttgt'

접근 변환 연산자가없는 당신은, 임의의 유형 사이에서 변환 할 수 없습니다.

1

두 개는 서로 다른 유형으로 정의됩니다. 둘 다 구조체이지만 동일한 유형이 아닙니다.

private T MyMethod<T>(T source, T target) 
{ 
0

이것은 "설계"입니다. 관련이없는 두 값 유형간에 전송을 시도하고 있습니다. 이 작업은 결코 성공하지 못하므로 오류로 표시됩니다.

이것은 암시 적으로 봉인 되었기 때문에 모든 값 유형에 해당됩니다. TSrc - > Ttgt 사이의 형 변환이 성공하려면 두 유형간에 클래스 계층 구조 관계가 있어야합니다. 모든 값 유형이 봉인되어 있으므로 다른 값 유형에서 파생 될 수있는 방법이 없으므로이 값을 사용할 수 없습니다.

성공할 수있는 유일한 방법은 형식간에 사용자 지정 변환 연산자가있는 경우입니다. 이 경우 일 수 있습니다. 그러나 제네릭 형식을 처리 할 때 사용자 지정 변환 연산자는 처리되지 않습니다.

0

Convert 클래스는이 정확한 목적으로 존재합니다.

return (Ttgt) (object) SourceObject; 
관련 문제