私はコードを簡素化し、コンパクト化し、できるだけコードの重複を排除しようとしています。私はRavenDBコレクションを照会するメソッドを持っており、照会は照会しようとしているタイプに適応する必要があります。この型は、メソッドに渡されるパラメータに応じて変化し、where節も適応する必要があります。 私は基本タイプAdministrativeAreaを持っていますが、他のタイプはLevel1_AdministrativeAreasからLevel5_AdministrativeAreasに派生しています。シナリオに応じて、私はなど、Level1_AdministrativeAreas、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、など)することができます」コンパイラは「何が来るのか」を知らないので推論することはできません。 私はこれが単にできないと思う。しかし、これはコードのメンテナンスに影響します。それぞれのタイプのクエリに対して異なるメソッドを作成するか、かなり大きなメソッドを作成する必要があります。いずれもあまりにも魅力的ではありませんが、私はそれを回避する方法を見ません。
これはあまり明確ではありませんが、ジェネリックで試してみてください:void Merge(int currentMergeLevel 、IDocumentSession currentSession) –
Embri