如何为表达式树传递默认参数?

Kar*_*rim 3 c# expression-trees default-parameters

假设我有以下功能

Dal.Person.GetAllByAge<T>(int iAge, Expression<Func<Person, T>> OrderBy)  
Run Code Online (Sandbox Code Playgroud)

我想为表达式传递一个默认参数,如 OrderBy = e=>e.ID,
以便如果未定义此参数,则默认值是按 id 排序。
这怎么可能?

Jon*_*eet 5

这里有两个问题:

  • 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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

(假设类型IDint

...但如果T不是,则演员表将失败int。请注意,双重转换用于“内部”部分最初告诉编译器您要将 lambda 表达式转换为哪种表达式树,然后“外部”部分将强制其成为T.

我很想改用重载:

public Whatever GetAllByAge(int age)
{
    return GetAllByAge(age, e => e.ID);
}
Run Code Online (Sandbox Code Playgroud)