C#:如何创建由非泛型子类扩展的通用超类

时间:2010-09-02 10:45:33

标签: c# generics inheritance constructor repository-pattern

我有一堆Repository类,看起来有点像下面这些。请注意,我省略了某些方法;我只是想让你有一种味道。

public class SuggestionRepository : ISuggestionRepository
{
    private IUnitOfWork _unitOfWork;

    public SuggestionRepository(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public Suggestion Load(int id)
    {
        Suggestion suggestion;
        suggestion = _unitOfWork.Load<Suggestion>(id);
        return suggestion;
    }

    public IQueryable<Suggestion> All
    {
        get { return _unitOfWork.GetList<Suggestion>(); }
    }
}

您可以想象我的存储库之间存在重复代码的数量。

我想创建一个Repository&lt; T&gt;由我的存储库扩展的类,所以希望我不必为每个编写样板代码。此类可能类似于以下内容:

internal class Repository<T> where T : Entity
{
    private IUnitOfWork _unitOfWork;

    internal Repository<T>(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public T Load(int id)
    {
        T t;
        t = _unitOfWork.Load<T>(id);
        return t;
    }

    public IQueryable<T> All
    {
        get { return _unitOfWork.GetList<T>(); }
    }
}

但是Visual Studio并没有向构造者展示任何爱情。它在参数列表括号周围说'意外令牌',说它不能在静态上下文中访问非静态字段_unitOfWork,并假装它不知道参数unitOfWork是什么。

显然,通用类可以具有构造函数,因为可以创建List&lt; T&gt;。例如。那是怎么回事?

2 个答案:

答案 0 :(得分:1)

泛型类的构造函数不应在方法名称中包含类型参数。简单地说

internal Repository(IUnitOfWork unitOfWork)

看看你是怎么过的。

答案 1 :(得分:0)

你不能在构造函数上指定<T>,这是因为类在泛型T上运行