2009-07-15 5 views
1

내가하는 방법이있다.감지 인터페이스

public void Store<T>(T value) where T : class, IIDModel, new() { 
     AddModelToCache(value); 
    } 

StoreUsingKey<T>에서 value 매개 변수 IIDModel를 구현하는 Store<T>을 알 수있는 방법이 있나요? 아니면 잘못된 방향으로 가고 있습니까? 각 방법에서 new() 제약 조건을 제거 리치

대답

는 코드가 작동 할 수 있습니다. 문제는 인스턴스화 할 수있는 객체로 인터페이스를 전달하려고 시도하는 것이 었습니다.

답변

1

각 메서드에서 new() 제약 조건을 제거하면 코드가 작동합니다. 문제는 인스턴스화 할 수있는 객체로 인터페이스를 전달하려고 시도하는 것이 었습니다.

5

당신은 이미 있습니다. Store < T> 메서드에 IIDModel 제약 조건을 추가하면 value 매개 변수가 IIDModel을 구현한다는 것을 보장 할 수 있습니다.

아, 네가 지금 무슨 말하는지 알 겠어. 이 방법에 대해 :

public void StoreUsingKey<T>(T value) where T : class, new() { 
       if (idModel is IIDModel) 
         Store<T>((IIDModel)idModel); 

       AddToCacheUsingKey(value); 
     } 

편집 다시 한번 : Tinister는 권리입니다. 이것은 그 자체로 트릭을하지 않을 것입니다. 그러나 Store 메소드가 Joel Coehoorn posted과 유사하면 작동해야합니다.

+0

그러나 StoreUsingKey 메서드에는이 제약 조건이 없습니다. Store 을 선택적으로 호출하려면 어떻게해야합니까? "위의 예는"IIDModel '에서'T '로 변환 할 수 없습니다. – kim3er

+0

이것이 작동하지 않는 것 같습니다 : 'IIDModel'은 일반 매개 변수가없는 생성자가있는 추상화되지 않은 유형이어야하며 제네릭 유형 또는 메서드의 매개 변수 'T'로 사용해야합니다. ' (T)' – Tinister

+0

, 클래스 제약은 붉은 청어였다. 나는 지나치게 제한적이었습니다. 두 방법 모두에서 클래스 제약 조건을 제거하면 코드가 작동하기 시작합니다. 당신의 도움을 주셔서 감사합니다. – kim3er

2
public void Store(IIDModel value) { 
    AddModelToCache(value); 
} 
+0

죄송합니다. 나는 더 명료해야했습니다. AddModelToCache 메서드는 또한 일반적으로 일반적입니다. – kim3er