Я работаю над приложением, где мне нужно вызвать один из двух методов данных, основанный на родовом типе вызывающего класса. Например, если T имеет тип Foo, я буду называть data.GetFoo():Вызов метода DAL на основе типа
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetFoo(mostRecentProcessedReadTime); // Notice GetFoo()
}
}
И если T имеет тип бара, я позвоню data.GetBar():
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetBar(mostRecentProcessedReadTime); // Notice GetBar()
}
}
До сих пор мне нужен только один метод DAL, потому что все типы были получены одинаково. Теперь мне нужно позвонить по одному из двух методов, в зависимости от типа T.
Я пытаюсь избежать чего-то вроде этого:
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
if (T is Foo) { return data.GetFoo(mostRecentProcessedReadTime); }
if (T is Bar) { return data.GetBar(mostRecentProcessedReadTime); }
}
}
Это нарушает OCP. Есть ли элегантный способ справиться с этим, поэтому я могу избавиться от моего заявления if?
Edit - Это то, что типы похожи
public partial class Foo1 : IDataEntity { }
public partial class Foo2 : IDataEntity { }
public partial class Bar1 : IDataEntity { }
public partial class Bar2 : IDataEntity { }
Этого Фоосом и Столбики элементы DBML, используемые с Linq-на-SQL.
У вас есть контроль над классами «Т» - они могут быть изменены, у вас есть базовый интерфейс/класс и т. Д. – NSGaga
См. Мое редактирование. Это помогает? –
Если вы не хотите менять Foo *, Bar *, и он должен быть GetFoo, GetBar - not Get(), как предлагал ataddeini (если я правильно понял?). Как вы собираетесь «вызывать» GetObjectList()? вы определяете, например, Foo, Bar перед вызовом (так что у вас есть, например,типизированная переменная) - или вы хотите назвать это довольно широко (используя T из другого общего метода)? Самый простой - это то, что сказал ataddeini, если сможете. – NSGaga