Во-первых, хорошо, что вы задали этот вопрос только с тремя пунктами - это делает решение проблем намного быстрее :).Ваш код очень общий, поэтому я могу предложить только общие решения.
Большая цель здесь состоит в том, чтобы увеличить инкапсуляцию классов A, B и C - чтобы убедиться, что все, что относится к A, B или C, хранится в этих классах ине перемещаться, скажем, в операторы if в другом месте.
Мы можем переместить логику для определения того, что является правильным источником данных из контроллера (который выполняет привязку) к вашему отчету.Имя этого метода должно быть описательным, как GetReportSubjectLine ().
class A{
<snip>
public virtual SomeDataType getDataSourceForViewType(){
throw new NotImplementedException()
}
}
class B{
<snip>
public override SomeDataType getDataSourceForViewType(){
return this.Foo;
}
}
class C{
public override SomeDataType getDataSourceForViewType(){
return this.Bar;
}
}
Этот код будет многократно использоваться, если вы когда-нибудь захотите создать другой пользовательский интерфейс, для которого все еще требуется информация этого типа из вашего отчета, чтобы генерировать любое графическое представление, которое вы генерируете.
Там нетхорошо обойти вторую проблему, которую вы представили.Мы также всегда можем перенести видимость панели в отчеты, но это увеличивает сцепление - насколько один класс связан с другим - слишком сильно.Ваши отчеты не должны быть привязаны к конкретному представлению.
Лучшее решение - добавить еще один слой косвенность - в данном случае, промежуточный класс для обработки логики того, какие панели следует использовать.сделать видимым, когда.Таким образом, ваш контроллер не должен нести ответственность за управление видимостью панели.
public class PanelVisibilityManager{
ICollection<Panel> ManagedPanels {get; set;}
//
public IDictionary<System.Type, ICollection<Panel>> Switchboard {get; set;}
public void TogglePanelsFor(System.Type item){
foreach(var panel in ManagedPanels){
panel.Visible=false;
}
foreach(var panel in Switchboard[item]){
panel.Visible=true;
}
}
Надеюсь, это поможет!