나는 다음과 같은 시나리오가와 제네릭 메서드 호출 :올바른 파생 형
내가 세 가지 클래스가을의 그들 A
, B
및 C
를 호출 할 수 있습니다. 공통점은 동일한 인터페이스 인 ISomeInterface
에서 상속 받고 Entity Framework를 사용하여 엔터티에 매핑되는 클래스라는 것입니다.
이 인터페이스를 구현하는 개체 목록을받은 메서드가 있지만 개체 자체는 A
, B
또는 C
의 인스턴스가됩니다.
방법 쉘이 문제는 ProcessEntity
방법입니다, 지금이
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
ProcessEntity(entity);
}
}
것 같습니다. 이 유형이나 단체에 따라 데이터베이스에서 일치하는 요소의 테이블을 검색해야하는 일반적인 방법이다, 그래서 다음과 같습니다
public void ProcessEntity<T>(T entity)
{
using(var repository = new DbRepository())
{
var set = repository.Set<T>();
...
}
}
문제는 T
가 ISomeInterface
때문에 라인 var set = repository.Set<T>();
이 실패한다는 것입니다 이 경우 실제 유형 (A
, B
또는 C
)이 아니므로 주어진 유형과 관련이없는 예외를 제공합니다. 이는 이해할 수 있습니다.
내 질문은 : 어떻게 ProcessEntity 목록에서 개체의 실제 형식 및 그들이 구현하는 interfacetype 호출 할 수 있습니다.
트릭을 수행 할 수도 있습니다. 나는'ProcessEntity (obj);를'ProcessEntity (obj as dynamic); '로 바꾼다. 동적 인 사용에 대해 나는 몰랐다.고마워요 :) –
@ ØyvindKnobloch-Bråthen 예,이 런타임 형식화가 많이 좋아요 –