IQueryable <> метод расширения - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть два вопроса, которые в основном относятся к одной и той же области:

  1. Моя конкретная проблема:

    У меня есть 2 класса: пользователи, автомобили Я хотел бы добавить метод создания расширения, который возвращает IQueryable <>, и использовать один и тот же метод для обоих типов. Возможно ли это?

  2. Более общий вопрос: Используя дженерики, я могу вернуть любой тип объекта. Можно ли ограничить тип возвращаемого значения конкретными типами (только мои классы User и Cars)?

Спасибо

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

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

public interface X {}

public class Car : X {}

public class User : X {}

public static class Xtensions
{
   public static Xtension( this X target ) {}
}

Я не вижу ваш код, но мне интересно, не будет ли это запахом кода ...

Но, если у вас есть доступ к коду / классам, почему бы вам не сделать это так:

public class X
{
    public virtual void CommonStuff() { }
}

public class Car : X {}

public class User : X {}

Сделав CommonStuff виртуальным, вы можете переопределить реализацию в любом конкретном случае (при необходимости).

Обобщения могут быть ограничены: отметьте эту статью.

1 голос
/ 07 апреля 2011

Если «Пользователь» и «Уход» основаны на одном и том же базовом классе, скажем, «Базовый», то вы можете выполнять такие действия, как:

   MyGenericType<T> where T : Base

В общем, вы можете указать «Базовый», где вы имеете в виду «Пользователь» или «Автомобиль».В методах расширения или других методах.То же самое.

Однако, если Пользователь и Автомобиль не используют один и тот же базовый класс, вам придется реализовать общий интерфейс, чтобы связать их вместе.Например:

class User : IMyInterface...
class Car : IMyInterface...

MyGenericType<T> where T : IMyInterface

Вы должны иметь что-то , чтобы связать два класса вместе.В противном случае вы не можете просто указать любые два класса , которые компилятор должен применять.

...