2014-02-24 87 views
3

我们有一个通用的方法,这样的数据访问库:是否有包装泛型方法的简写?

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写入库。所以,我们可以在一定程度上改变它。

注意:我完全准备好接受“没有办法做你想做的事”,“你做错了”或其他“你是白痴”作为合格个人的答案。

+0

如何你预计这会得到多少?你已经有了方法链和可选参数......就我所知,占用大量空间的代码只有一部分是你无法摆脱的参数列表。 – evanmcdonnal

+0

@evanmcdonnal我很理想地希望得到几乎相当于预处理模板/宏的东西。或者让DataObject超类持有这些方法,并让子类在单个简短的行中“借用”它们 - 或根本没有行。 – svidgen

+0

我认为里德提供了这个答案。我认为C#中最接近的就是这些或那些方面的内容。 – evanmcdonnal

回答

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> 
{ 
} 
+0

我开始玩弄这个,它看起来很有前途。很酷。 – svidgen