我们有一个数据访问库,其中包含如下通用方法:
public List<T> Find<T>(
List<DataObject> conditions,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
T start = null) where T : DataObject, new()
{
...
}
// special case of Find()
public List<T> Find<T>(
DataObject condition,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
T start = null) where T : DataObject, new()
{
...
}
我们的业务对象通常会被赋予一些Get()
方法,如下所示:
public static MyClass Get(Guid id)
{
List<MyClass> possibles = Get(new MyClass() { Id = id });
if (possibles.Count == 1)
{
return possibles[0];
}
else
{
return null;
}
}
public static List<MyClass> Get(
MyClass condition,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
MyClass start = null)
{
using (QueryBuilder qb = ResourceFinder.GetQueryBuilder()) {
return qb.Find<MyClass>(condition, fuzzy, order, limit, start);
}
}
public static List<MyClass> Get(
List<MyClass> conditions,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
MyClass start = null)
{
using (QueryBuilder qb = ResourceFinder.GetQueryBuilder()) {
return qb.Find<MyClass>(conditions, fuzzy, order, limit, start);
}
}
是否有更短的方式来定义这些更高级Get()
?
这将是一个使用一些预处理的好地方;但C#缺乏。除了少数例外,除了 Type “参数外,它们都是相同的。”最终的目标是让这些几乎完全相同的定义更少的复制/粘贴/替换工作 - 这无疑是没有多大工作;它只是感觉很傻。
上下文信息:每个有问题的类都继承自抽象DataObject
。我们确实可以控制数据访问库,包括DataObject
类,但目的是让它成为一个相当不可知的,可插入的SQL编写库。所以,我们可以在一定程度上改变它。
注意:我完全准备接受“没有办法做你想做的事”,“你做错了”,或其他“你是个白痴”作为合格个人的回答
答案 0 :(得分:4)
您可以使用以下方法创建通用基类:
class SomeBase<T> where T : DataObject, new()
{
public T Get(Guid id) where T : DataObject, new()
{
return Get(new T() { Id = id }).FirstOrDefault();
}
public List<T> Get(
T condition,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
MyClass start = null) where T : DataObject
{
using (QueryBuilder qb = ResourceFinder.GetQueryBuilder()) {
return qb.Find<T>(condition, fuzzy, order, limit, start);
}
}
public List<T> Get(
List<T> conditions,
Boolean fuzzy = false,
String order = null,
Int32 limit = Int32.MaxValue,
MyClass start = null) where T : DataObject
{
using (QueryBuilder qb = ResourceFinder.GetQueryBuilder()) {
return qb.Find<T>(conditions, fuzzy, order, limit, start);
}
}
如果您再将其子类化为特定的类工厂类型,则无需重新输入:
// This class will have "typed" versions for these factory methods
public class MyClassFactory : SomeBase<MyClass>
{
}