C #: Как создать универсальный суперкласс для расширения неуниверсальными подклассами - PullRequest
1 голос
/ 02 сентября 2010

У меня есть несколько классов репозитория, которые выглядят примерно так: Обратите внимание, что я опустил некоторые методы; Я просто хочу, чтобы ты почувствовал вкус.

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

Вы представите количество повторяющегося кода между моими репозиториями.

Я хотел бы создать класс репозитория , который расширяется моими репозиториями, так что, надеюсь, мне не придется писать шаблонный код для каждого из них. Этот класс может выглядеть примерно так:

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.

Очевидно, что универсальные классы могут иметь конструкторы, например, для создания списка . Так что же происходит?

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Конструктор для универсального класса не должен иметь аргументов типа в имени метода. Просто скажи

internal Repository(IUnitOfWork unitOfWork)

и посмотри, как ты поживаешь.

0 голосов
/ 02 сентября 2010

Вы не можете указать <T> в конструкторе, это подразумевается тем фактом, что класс работает с универсальным типом T

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...