C # MVC универсальный класс репозитория с интерфейсом - PullRequest
1 голос
/ 19 июля 2011

Как мне добиться чего-то похожего на следующий пример?

public interface IGenericRepository {
   int id { get; }
   T GetById<T>() where T : class
}

public class GenericRepository : IGenericRepository {
   //Some code here

   public T GetById<T>(int tid) where T : class
   {
       return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
   }
}

и я хотел бы использовать это следующим образом:

GenericRepository gr = new GenericRepository();
Category cat = gr.GetById<Category>(15);

Конечно, этот код не работает, так как если я определю T : class, то часть tbl.id не будет работать. Но, конечно, должен быть способ понять это.

UPDATE

Учитывая ответ Драйса, я делаю следующее, но все еще не могу заставить это работать:

public interface IEntity
{
    int id { get; }
}

public interface IGenericRepository : IEntity
{
    T GetById<T>(int id);
}

public class GenericRepository : IGenericRepository
{
    public T GetById<T>(int id) {
    return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
    }
}

На данный момент tbl.id работает, но dataContext.GetTable<T> дает мне ошибку.

1 Ответ

5 голосов
/ 19 июля 2011

Вы можете ограничить T типом, содержащим идентификатор, вам, вероятно, понадобится интерфейс для него:

public interface IEntity 
{ 
    int Id { get; }
}

Затем объявите свой универсальный метод как:

public IQueryable<T> GetById<T>(int tid) where T : IEntity
{ 
   return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
}

Конечно, вам нужно будет реализовать IEntity для всех сущностей.Я предполагаю, что вы используете Linq2Sql или подобное, и в этом случае вы можете просто сделать частичное определение класса, которое включает реализацию интерфейса.

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