У меня есть такие функции, как этот ниже, который загружает таблицу базы данных, используя LinqToSql и возвращает список записей, преобразованных в моей пользовательской модели класса:Нужна помощь упрощение методов с использованием дженериков в C#
public List<AreaModel> LoadListOfAreaModels(Boolean includeDeleted = false)
{
using (LinqToSqlDataContext dc = new LinqToSqlDataContext())
{
IQueryable<Areas> filtered = includeDeleted
? dc.Areas.Where((c) => !c.DataRowDeleted)
: dc.Areas;
return filtered.Select((c) => AreaModel.ModelFactoryFromLinq(c)).ToList();
}
}
Теперь я имеют довольно много таблиц, и все они должны загружаться и преобразовываться одинаково.
Могу ли я как-то избежать наложения этой функции дюжину раз и просто изменить AreaModel
и Areas
, например. TownModel
и Towns
с использованием общей функции?
Я уже пробовал это, но не смог, потому что не смог найти способ вызова статического метода класса, если у меня есть только его общий тип.
Дополнительная информация: (!, Который не содержит статический фабричный метод, мне нужно позвонить, хотя) Все XxxModel
классов имеют общий суперкласс ModelBase
, все классы Linq стола (как Areas
или Towns
) осуществлять общий интерфейс ILinqClass
.
Любые идеи о том, как реализовать этот самый элегантный способ?
Вдохновленный knittl «s ответ, я пришел с этим решением:
public List<TModel> LoadListOfModels<TLinq, TModel>(
Func<TLinq, bool> filter,
Func<TLinq, TModel> modelFactory
)
where TLinq : class, ILinqClass
where TModel : ModelBase
{
using (LinqToSqlDataContext dc = new LinqToSqlDataContext())
{
return dc.GetTable<TLinq>()
.Where(filter)
.Select(modelFactory)
.ToList();
}
}
Является 'DataRowDeleted' определенный в 'ModelBase'? – Lee
@Lee Да, 'DataRowDeleted' это часть интерфейса' ModelBase' реализует –
Проблема, о которой вы говорите, заключается в том, что AreaModel является статическим классом. Почему бы вам не попытаться сделать вас AreaModel, TownModel не статическим классом? Затем они могут реализовать интерфейс, что-то вроде IModelFactory с помощью метода ModelFactoryFromLinq, а затем вы можете передать реализацию этого интерфейса вашему методу LoadList .... –