Вы не пытаетесь расширить IQueryable
, судя по вашему примеру.Удалите this
из определения метода, и ваш пример должен работать нормально.
public class OrderByCollection
{
// .. shameless cut ..
public IQueryable<T> ExecuteOrderBys<T>(IQueryable<T> source)
{
// .. we don't need no stinking body ..
}
}
Что заставит ваш пример работать:
var q = db.tblJobHeaders;
OrderByCollection OBys = new OrderByCollection();
OBys.AddOrderBy("some field", true);
OBys.AddOrderBy("anotherfield", false);
OBys.ExecuteOrderBys(q);
В качестве примечания я бы не использовал bool
чтобы определить порядок сортировки.Код неясен.Вместо этого используйте перечисление или другие методы:
OBys.AddOrderBy("some field", Sort.Ascending);
или:
OBys.AddOrderByDescending("some field");
Обновление
Методы расширения используются для «подключения» методов к существующим классам или интерфейсам.Написав public IQueryable<T> ExecuteOrderBys<T>(this IQueryable<T> source)
, вы действительно говорите, что метод должен быть подключен к IQueryable<T>
.И поэтому к нему следует обращаться как myQuery.ExecuteOrderBys
.
Я предполагаю, что методы расширения должны быть статическими и включаться в статические классы, чтобы избежать путаницы:
a) Они действительно не являются членамиклассы или интерфейсы и не могут получить доступ ни к чему, кроме открытых полей / свойств / методов.
б) Они могут расширять любой класс.Без ограничения вы можете поместить вызов метода DoSomething(this ThatObject instance)
в класс с именем ThatObject
.Проблема в том, что вы не можете получить доступ ни к чему, кроме открытого интерфейса, так как это метод расширения.
Запутанные возможности были бы бесконечны;)