Как совместить два общих метода - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть два расширения:

public static IQueryable<T> Existing<T>(this IQueryable<T> qry) 
    where T : class, IDeletable
{
    return qry.Where(...);
}

public static IEnumerable<T> Existing<T>(this IEnumerable<T> qry) 
    where T : class, IDeletable
{
    return qry.Where(...);
}

Как мне объединить эти два метода в один метод? Я попробовал следующее:

public static TU Existing<TU, T>(this TU qry)
    where TU : class, IQueryable<T>, IEnumerable<T>
    where T : class, IDeletable
{
    return (TU)qry.Where(...);
}

Но это не работает, потому что тип не может быть выведен правильно (потому что IQueryable наследуется от IEnumerable, я думаю). Более того, T не всегда IQueryable, что также является проблемой здесь (вопрос: если я укажу несколько интерфейсов в предложении where, разве они не сопоставляются дизъюнктивным образом?). В предыдущем случае IQuerable был использован, если он подходит, или же IEnumerable. Как я могу обойти это?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Ваша попытка будет всегда ограничивать ее IQueryable<T> реализациями. Я предполагаю, что вы действительно хотите, чтобы он работал как для запросов внутри процесса, так и для запросов вне процесса. Предполагая, что «...» в предложении Where является лямбда-выражением, вы должны знать, что даже если у вас одинаковый код в обоих методах, компилятор будет обрабатывать их совершенно по-разному - потому что он уже будет иметь примененное разрешение перегрузки для определения используемой реализации Where.

Я бы настоятельно рекомендовал вам оставить две отдельные перегрузки как есть.

2 голосов
/ 16 декабря 2011
public static IQueryable<T> Existing<T>(this IEnumerable<T> qry) where T : class, IDeletable
{
    return qry.Where(/*...*/).AsQueryable();
}

Вызов AsQueryable на то, что уже запрашивается, ничего не сделает. Кроме того, IQueryable наследуется от IEnumerable, поэтому, во-первых, вы можете передать IQueryable этому методу, и, во-вторых, результатом является IEnumerable, а также IQueryable.

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