универсальный метод расширения - PullRequest
0 голосов
/ 07 мая 2009

Я работаю над этим проектом mvc, следуя серии видеороликов Роба Коннери, и применяю методы Что касается методов фильтрации и расширений, я начал много повторяться, например:

public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}

public static Keyword WithID(this IQueryable<Keyword>qry,int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}
....

Чтобы предотвратить это, я пытаюсь написать общее расширение, подобное этому:

public static T WithID<T>(this IQueryable<T>qry,int ID)
{
    return qry.SingleOrDefault(s=>ID==ID);
}

однако s не имеет идентификатора, так как бы вы решили это?

Ответы [ 2 ]

5 голосов
/ 07 мая 2009

Вам потребуется интерфейс, который объявляет свойство идентификатора, например,

public interface IInt32Identifiable
{
    public int ID { get; }
}

Тогда вы можете написать:

public static T WithID<T>(this IQueryable<T> source, int id)
    where T : IInt32Identifiable
{
   return source.SingleOrDefault(s=> s.ID == id);
}

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

0 голосов
/ 07 мая 2009

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

Единственная другая альтернатива, о которой я могу подумать, потребует отражения для запроса типа для свойства ID, и, если оно существует, получит значение.

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