C # MVC универсальный репозиторий с произвольным именем столбца - PullRequest
0 голосов
/ 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);

Конечно, в этом случае tbl.idв GenericRepository выдает ошибку.

РЕШЕНИЕ

public class IHasId
{
    public int id { get; set; }
}

public interface IGenericRepository
{
    int id { get; }

    T GetById<T>(int id) where T : IHasId;
}

public class GenericRepository : IGenericRepository
{
    public int id
    {
        get { throw new NotImplementedException(); }
    } 

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

И кроме этого, НЕ забудьте определить это где-нибудь в вашей модели:

public partial class Category : IHasId { }

использование:

Repository rep = new Repository();
Category cat = rep.GetById<Category>(15);

Ответы [ 3 ]

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

Здесь есть несколько проблем - во-первых, тип, который вы сопоставляете, является классом, но у класса нет свойства с именем 'id'. Вам необходимо, чтобы ваш класс Category реализовал интерфейс, который предоставляет свойство 'id':

public interface IIdentity
{
    int identity { get; set; }
}

public class Category : IIdentity
{
    public int identity{ get; set; }
}

Я не знаю, почему вы выставили 'id' как свойство в интерфейсе IGenericRepository - несомненно, это должен быть параметр, передаваемый методу find (как указано вашей реализацией). Вам также необходимо изменить ограничение метода GetById с:

where T : class

к чему-то вроде

where T : IIdentity

используя интерфейс, который я предложил выше.

1 голос
/ 19 июля 2011
public class IHasId
{
    public int id { get; set; }
}

public interface IGenericRepository<T>
{
    int id { get; }

    T GetById(int id);
}

public class GenericRepository<T> : IGenericRepository<T> where T : IHasId
{
    public int id
    {
        get { throw new NotImplementedException(); }
    }

    public T GetById(int id)
    {
        return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
    }
}
1 голос
/ 19 июля 2011

Вы получаете эту ошибку, потому что вы принимаете каждый класс where T : class.У класса нет этого свойства.

Создайте абстрактный класс или интерфейс, чтобы убедиться, что это свойство существует, и измените where T : class на where T : IHasIdProperty.

...