2016-06-01 2 views
1

데이터베이스 모델과 일반 시스템 모델의 두 가지 유형이 있습니다.새로운 유형 제약 조건을 가진 일반 생성자

저는 모델을 데이터베이스 모델로 변환 할 수 있기를 원하고 그 반대도 마찬가지입니다.

public static E FromModel<T, E>(T other) 
      where T : sysModel 
      where E : dbModel 
{ 
    return new E(other); 
} 

은 기본적으로 모두 sysModeldbModel 추상적 있습니다

나는 내가 쓴 다음과 같은 방법이있다.

dbModel에는 모두 복사 생성자가있는 많은 상속 클래스가 있습니다.

임 수신 :

은 그렇지 기술적 가끔 일치를 해달라고

임 알고 새로운() 제약 조건을 가지고 becauase 형식 매개 변수 'E'의 인스턴스를 만들 수 없습니다 T의 모든 값에 대한 생성자, 적어도 디버거가 알고있는 것은 무엇인지 알고 있어야합니다.

또한 제약 조건 인 where E : dbModel, new()을 추가하려고했지만 관련성이 없습니다.

일반적인 방법과 매개 변수를 사용하여 다른 모델로 모델을 변환 할 수있는 방법이 있습니까?

감사합니다.

생성자에 매개 변수를 사용하고 있기 때문에
public static E FromModel<T, E>(T other) 
     where T : sysModel 
     where E : dbModel, new() 

, 당신은 new을 사용할 수 없습니다 제네릭 형식에 new을 사용하려면

+0

는 매개 변수가없는 생성자를 가지고있다. 아마도 당신은 원하는 복사본 구성의 유형을 노출시키는 인터페이스를 통해 일종의 일반적인 팩토리 메소드를 소개해야 할 것입니다. – Anthony

+0

나는 constructor을 인자로 넘기는 것을 피하고 싶다. –

+1

generic 타입 인자에 인자를 가진 생성자가 존재할 수 없다. 그렇게하기 위해서'Activator.CreateInstance'를 사용하고, 사용 된 타입이 일치하는 생성자를 갖도록기도해야합니다. 일반적으로 제네릭 형식을 사용하는 솔루션은 구현에 대한 의존도가 높기 때문에 이러한 종류의 작업을 삼가해야합니다. 이것은 "나는이 메소드가 모든 유형의 스토리지 클래스 * ANY TYPE *을 생성 할 수 있기를 원하지만 생성자에 문자열 매개 변수가 있어야하며 파일 이름이어야합니다."라고 말합니다. –

답변

3

, 당신은 클래스/메소드 정의에 new() 제약 조건을 지정해야 하지만 인수로 other을 대신 Activator를 사용하여 전달할 수 있습니다

은`새()`제약 조건 유형을 지정하는 것입니다
public static E FromModel<T, E>(T other) 
    where T : sysModel 
    where E : dbModel 
{ 
    return (E)Activator.CreateInstance(typeof(E), new[]{other}); 
} 
+0

컴파일하는 것 같다. 그것은 무엇을 부술 것인가? 그것은 모든 종류의 예외가 던져 질 수있는 것처럼 보입니다. T를 사용하는 일치하는 생성자를 찾아야한다는 것을 이해합니다. 맞습니까? –

+0

정확합니다. 'E'가 단일 파라미터'T'를 취하는 생성자를 가지고 있지 않으면, 예외를 던질 것입니다. –

+0

awesome, db.ill의 버그와 구멍을 막기 위해 2 분 안에 받아 들일 수 있습니다. –

관련 문제