Как указать тип идентификатора универсального типа (для запросов базы данных) вместе с типом genric - PullRequest
2 голосов
/ 16 февраля 2010

Я думал о внедрении репозитория для каждого объекта (например, репозитория Person, репозитория State и т. Д.), Прежде чем принимать решение о сфере деятельности Repository вместо этого, НО у меня все еще остается вопрос относительно передачи идентификатора (идентификатора) тип с универсальным.

В двух словах, у Лица может быть идентификатор GUID, у штата / округа может быть идентификатор int и т. Д. Имея это в виду, как я могу передать тип, который указывает идентификатор, то есть тип универсального передается в?

Вот моя попытка интерфейса:

public interface IRepository<T, TID> where T : class where TID : Type
{        
    T Get(TID id);
    IList<T> GetAll();
    void Update(T entity);
    void Insert(T entity);
    void Delete(TID id);
}

Вы можете видеть, что T является классом (Person, State и т. Д.), И я намереваюсь, чтобы TID был типом, который используется для идентификатора, то есть посмотрите на T Get (TID id).

Это приводит к ошибке компиляции: «Тип« строка »нельзя использовать в качестве параметра типа« TID »в универсальном типе или методе« DumpWebApp.IRepository ». Неявного преобразования ссылок из« строки »в« нет » System.Type. "

Другим способом сделать это было бы передать фактический элемент в методы Get и Delete, я думаю, но это кажется немного неуклюжим.

Спасибо за любые предложения - и, кстати, приемлем ли возврат IList для GetAll ()? Почему не IQueryable или T []?

Майк К.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Просто отбросьте ограничение where TID : Type. Это должно сработать.

1 голос
/ 16 февраля 2010

IQueryable нет. IList да. Массив да в зависимости. IList безопасен.

Ваше ограничение TID говорит, что TID будет иметь тип Type.

брось это.

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