【发布时间】:2016-04-28 21:30:59
【问题描述】:
我有下面这样的函数,它使用 LinqToSql 加载数据库表并返回转换为我的自定义模型类的条目列表:
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 的回答启发,我想出了这个解决方案:
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 是的,
DataRowDeleted它是接口的一部分ModelBase实现 -
您提到的问题是 AreaModel 是一个静态类。你为什么不试着让你的 AreaModel、TownModel 成为一个非静态类呢?然后他们可以实现一个接口,比如带有方法 ModelFactoryFromLinq 的 IModelFactory ,然后您可以将此接口的实现传递给您的 LoadList... 方法。
-
@JordiRuiz AreaModel 不是静态的,由于参数和返回类型不同,我无法将 ModelFactoryFromLinq() 放入接口。