2012-08-06 2 views
5

나는 다음과 같은 도우미 방법이 있습니다제네릭 형식 매개 변수 없음 권투 또는 유형 매개 변수를 변환하지

public T Map<F, T>(F value, T toValue) 
    where T : new() 
    where F : new() 
{ 
    if (typeof(T).BaseType.FullName == "MyNamespace.Request") 
    { 
     toValue = MyExtensions.CreateRequest<T>(); 
    } 
    else 
    { 
     toValue = new T(); 
    } 
} 

:

public static T CreateRequest<T>() 
    where T : Request, new() 
{ 
    T request = new T(); 
    // ... 
    // Assign default values, etc. 
    // ... 
    return request; 
} 

나는 다른 도우미에서 다른 방법의 내부에서이 방법을 사용하려면를 그런데 오류가 발생합니다 :

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'MyExtensions.CreateRequest()'. There is no boxing conversion or type parameter conversion from 'T' to 'MyNamespace.Request'.

"T"유형을 캐스팅 할 수있는 방법이 있습니까? CreateRequest woul 그것을 문제없이 사용합니까?

편집 : 내가 두 가지 일을 할 수있는 알고

는 :

  • CreateRequest에 제약을 풀거나
  • 지도에 제약 조건을 조입니다.

하지만 CreateRequest I 사용자 클래스에서 요청 클래스의 사용자 속성을 사용할 수 없으며 두 번째 작업을 수행 할 수 없습니다. 다른 유형 (요청에서 상속받지 않음)을 Map 기능.

+0

는 의미 "하나 또는 없음" –

답변

4

당신이 CreateRequest의 일반적인 제한을 완화해야이 시나리오.

public static T CreateRequest<T>() 
    where T : new() 
{ 
    if(!typeof(Request).IsAssignableFrom(typeof(T))) 
     throw new ArgumentException(); 

    var result = new T(); 
    Request request = (Request)(object)result; 
    // ... 
    // Assign default values, etc. 
    // ... 
    return result ; 
} 

이 매개 변수의 컴파일 시간 확인이 손실 될 수 있으므로 힘들 수 있습니다.

또는 CreateRequest 방법을 다른 곳에서 사용하려는 경우이 시나리오에 대해서만 일반 제원 과부하를 만드십시오.

public static object CreateRequest(Type requestType) 
{ 
    if(!typeof(Request).IsAssignableFrom(requestType)) 
     throw new ArgumentException(); 

    var result = Activator.CreateInstance(requestType); 
    Request request = (Request)result; 
    // ... 
    // Assign default values, etc. 
    // ... 
    return result ; 
} 
+0

왜이 더블 캐스팅이 필요합니까? '(Request) (object) result;' –

+0

'.IsAssignableFrom'과 잘 어울립니다! 스트링 비교보다 나은 방법! –

+0

듀얼 캐스트는 컴파일러가 자신이하는 일과 책임에 대해 알고 있음을 알려주는 것입니다. 그것이 없으면 작동하지 않을 것이며 위의 경우 이것이 작동 할 것입니다. – Rafal

3

T의 유형은 CreateRequest 방법에서 Request이라고 선언했습니다. 반면에 Map 메서드에는 그러한 제약이 없습니다. Map의 선언을 변경해보십시오 :

public T Map<F, T>(F value, T toValue) 
where T : Request, new() 
where F : new() 
+0

문제는 내가 요청에서 상속하지 않는 유형과지도 기능을 사용, 그래서이 contraint을 설정할 수 없습니다. –

+0

그런 다음 CreateRequest 함수에서 Request 제약 조건을 제거해보십시오. – daryal

관련 문제