Агентство - это класс, которым вы управляете? Если это так, сделайте что-то вроде этого:
public abstract class GenericDb
{
public abstract void Query(parms);
}
В вашем агентском классе вы можете иметь
public GenericDb ClientDb {get; set;}
Тогда имейте класс SqlDb как:
public class SqlDb : GenericDb
{
public void Query(parms);
}
public class PicDb : GenericDb
{
public void Query(parms);
}
Тогда этот код:
public void Query(Agency agency, Citation queryCitation) {
queryCitation.AgencyCode = agency.AgencyCode;
switch (agency.ClientDb.Type) {
case "SQL":
QueryOracle(agency, queryCitation);
break;
case "PIC":
QueryPick(agency, queryCitation);
break;
}
}
становится
public void Query(Agency agency, Citation queryCitation) {
queryCitation.AgencyCode = agency.AgencyCode;
agency.ClientDb.Query(queryCitation);
}
Из-за наследования будет известно, что ClientDb имеет базовый класс GenericDb. По типу параметра ClientDb он будет знать, должен ли он запускать SqlDb, PicDb, Oracle и т. Д.