2011-07-18 3 views
1

Как я могу добиться чего-то вроде следующего примера?C# MVC общий класс репозитория с интерфейсом

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

УЧИТЫВАЯ driis', я делаю следующее, но я до сих пор не могу получить эту работу:

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> дает мне ошибка.

+0

см http://stackoverflow.com/questions/735140/c-linq-to-sql-refectoring-this-generic-getbyid-method – hatchet

ответ

5

Вы можете ограничить 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; 
} 

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

+0

и в какой интерфейс я должен определить T GetByID (INT TID)? или даже лучший вопрос: мне нужно определить его в интерфейсе? : D – Shaokan

+0

Вероятно, вы хотите, чтобы GetById находился в вашем базовом интерфейсе репозитория. – driis

+0

Прошу прощения, но я действительно новичок в этом материале, можете ли вы представить полный пример? Потому что, когда я пытаюсь реализовать IEntity, GetTable не работает, так как он требует ссылочного типа. – Shaokan

Смежные вопросы