나는 코드를 단순화하고 압축하여 가능한 한 코드 중복을 제거하려고합니다. 나는 RavenDB 콜렉션을 쿼리하는 메소드를 가지고 있으며 쿼리는 내가 쿼리 할 타입에 적응해야한다. 이 유형은 메소드에 전달 된 매개 변수에 따라 변경되며 where 절도 적응해야합니다. 다른 유형이 Level1_AdministrativeAreas에서 Level5_AdministrativeAreas로 파생되는 AdministrativeArea 기본 유형이 있습니다. 시나리오에 따라, I 등 AdministrativeAreas, Level1_AdministrativeAreas를 쿼리해야RavenDB 쿼리에 동적 매개 변수 사용
내가 현재 무엇을 가지고 :
private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession)
{
(...)
IQueryable<AdministrativeArea> query;
if (currentMergeLevel == MergeLevel.Level1)
query = currentSession.Query<AdministrativeArea, AdminAreaName>()
.Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1));
(...)
}
가 메소드 매개 변수로 유형을 전달하고는 적용이 어떤 방법이 있나요 이 같은 쿼리 : 나는 컴파일 타임에 여러 가지 문제에 직면 한
private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession, Type requiredType, Type indexType)
{
(...)
IQueryable<requiredType> query;
if (currentMergeLevel == MergeLevel.Level1)
query = currentSession.Query<requiredType, indexType>()
.Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1));
(...)
}
, 즉 "변수이지만 형처럼 사용된다", 그리고 사실 그 멤버 변수 (NAME_0, NAME_1 등) 수 ' 컴파일러가 "무엇이 오는지"를 알지 못하기 때문에 추론 할 수 없습니다. 이 작업을 수행 할 수 없다고 생각합니다. 그러나 이것은 각 유형의 쿼리에 대해 다른 메소드를 작성하거나 다소 큰 메소드를 작성해야하므로 코드 관리에 영향을 미칩니다. 어느 쪽도 매력적이지는 않지만 그 주위에는 어떤 방법도 보이지 않는다.
매우 명확하지는 않지만 generics를 사용해보십시오. void Merge (int currentMergeLevel , IDocumentSession currentSession) –
Embri