我有這樣一個功能下加載使用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的回答啓發,我想出了這個解決方案:
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'的一個接口的一部分implements –
你提到的問題是AreaModel是一個靜態類。你爲什麼不試着讓你的AreaModel,TownModel成爲一個非靜態類?然後他們可以用一個方法ModelFactoryFromLinq實現一個接口,就像IModelFactory一樣,然後你可以將一個實現傳遞給你的LoadList方法的接口。 –