2010-09-02 32 views
1

我有一堆存储库类,它们都看起来有点像下面。请注意,我省略了某些方法;我只是想让你有味道。C#:如何创建一个通用的超类,以扩展非泛型子类

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>(); } 
    } 
}

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

我想创建一个存储库<T>类,它由我的存储库扩展,所以希望我不必为每个存储库编写样板代码。这个类可能看起来像以下:

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是什么。

明显泛型的类可以有构造函数,因为它可能新增列表<T>例如。发生什么了?

+0

获取要显示的尖括号,他们需要(格式化为代码,即对自己工作的事实暗示行缩进四个空格,或用引号括起来)。 'code'按钮(101010)将对您在编辑器中选择的任何文本执行正确的操作。 – AakashM 2010-09-02 10:48:38

+0

@Paul Ruane通过删除不正确的语法与您的编辑,你已经使人们很难找出问题是什么... – AakashM 2010-09-02 10:52:02

+0

谢谢保罗,我感谢您的编辑。我可以使用这篇文章作为获取格式正确的参考。 – David 2010-09-02 10:58:31

回答

1

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

internal Repository(IUnitOfWork unitOfWork) 

看看你是怎么回事。

+0

这就是獾。 – David 2010-09-02 11:15:16

0

你不能在构造函数中指定<T>,它是由该类上泛型类型T