c # Linq to SQL и Generics - PullRequest
       1

c # Linq to SQL и Generics

2 голосов
/ 13 декабря 2010

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

    public T GetEntity<T>(int id) where T : class
    {
        return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
    }

Вышесказанное явно не сработает, потому что o в o.id неизвестно и, следовательно, не может получить доступ к свойству id - может кто-нибудь помочь с тем, как этого добиться?

Ответы [ 4 ]

4 голосов
/ 13 декабря 2010

Если все ваши сущности содержат свойство id, вы можете определить интерфейс

public interface IEntity
{
    int id { get; }
}

, реализовать его на всех ваших классах и изменить метод на

public T GetEntity<T>(int id) where T : IEntity
{
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
}

Интерфейс может быть полезен во всех местах, где вы хотите сделать что-то для всех ваших сущностей, т.е.Удалить по id.Вы можете добавить больше свойств в ваш интерфейс, т.е.метка времени.

1 голос
/ 13 декабря 2010

Если вы не можете изменить классы сущностей (для реализации общего интерфейса), вы можете использовать функцию предиката и передать ее в метод

public T GetEntity<T>(int id, Func<T, int, bool> predicate) where T : class
{
    return db.GetTable<T>().SingleOrDefault(o => predicate(o,id));
}
1 голос
/ 13 декабря 2010

Другое решение, не рекомендуется по соображениям производительности, но я все равно опубликую его.

public T GetEntity<T>(int id) where T : class 
    { 

        return db.GetTable<T>().AsEnumerable().SingleOrDefault(o => (int)o.GetType().GetProperty("Id").GetValue(o,null) == id);

    } 
0 голосов
/ 13 декабря 2010

Вам нужно установить ограничение на ваш T, чтобы компилятор мог быть уверен, что есть свойство id.Один раз - это использовать интерфейсы, т.е.

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