是否有包装Generic方法的简写?

时间:2014-02-24 23:16:56

标签: c# .net generics

我们有一个数据访问库,其中包含如下通用方法:

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

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

1 个答案:

答案 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>
{
}