我们有一个通用的方法,这样的数据访问库:是否有包装泛型方法的简写?
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()
s?
这将是一个使用一些预处理的好地方;但C#缺乏。除了少数几个例外,它们都是相同的,除了类型“参数”。最终的目标是让这些几乎相同的定义少一些复制/粘贴/替换的工作 - 这是公认的不多的工作;它只是感觉很傻。
上下文信息:每个有问题的类都继承自摘要DataObject
。我们确实可以控制数据访问库,包括DataObject
类,但其目的是让它成为一个相当不可知的,可拖放的SQL写入库。所以,我们可以在一定程度上改变它。
注意:我完全准备好接受“没有办法做你想做的事”,“你做错了”或其他“你是白痴”作为合格个人的答案。
如何你预计这会得到多少?你已经有了方法链和可选参数......就我所知,占用大量空间的代码只有一部分是你无法摆脱的参数列表。 – evanmcdonnal
@evanmcdonnal我很理想地希望得到几乎相当于预处理模板/宏的东西。或者让DataObject超类持有这些方法,并让子类在单个简短的行中“借用”它们 - 或根本没有行。 – svidgen
我认为里德提供了这个答案。我认为C#中最接近的就是这些或那些方面的内容。 – evanmcdonnal