Как передать параметр по умолчанию для дерева выражений? - PullRequest
2 голосов
/ 17 апреля 2011

предположим, у меня есть следующая функция

Dal.Person.GetAllByAge<T>(int iAge, Expression<Func<Person, T>> OrderBy)  

я хочу передать параметр по умолчанию для выражения, как OrderBy = e => e.ID
так что если этот параметр не определен, по умолчанию используется сортировка по id.
как это возможно?

1 Ответ

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

Здесь есть две проблемы:

  • e => e.ID может быть недействительным для T, который предоставляется
  • Вы можете использовать только константы в параметрах по умолчанию

Вы можете вроде обойти это, выполнив:

public Whatever GetAllByAge<T>(int age,
                               Expression<Func<Person, T>> orderBy = null)
{
    orderBy = orderBy ?? (Expression<Func<Person, T>>) 
                         (Expression<Func<Person, int>>)(e => e.Id);
    ...
}

(при условии, что тип ID равен int)

... но приведение не будет выполнено, если T не int. Обратите внимание, что двойное приведение предназначено для "внутренней" части, чтобы первоначально сказать компилятору, в какое дерево выражений вы хотите преобразовать лямбда-выражение, а "внешняя" часть должна затем заставить это быть подходящим типом дерева выражений для * 1022. *.

Вместо этого я хотел бы использовать перегрузку:

public Whatever GetAllByAge(int age)
{
    return GetAllByAge(age, e => e.ID);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...