Здесь есть две проблемы:
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);
}