3

假设我有以下功能

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

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

4

1 回答 1

5

这里有两个问题:

  • e => e.IDT可能对提供的内容无效
  • 您只能在默认参数中使用常量

您可以通过以下方式解决此问题:

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);
    ...
}

(假设类型IDint

T...但如果不是,演员表将失败int。请注意,双重转换是为了让“内部”部分最初告诉编译器要将 lambda 表达式转换为哪个表达式树,而“外部”部分则强制它成为T.

我很想改用重载:

public Whatever GetAllByAge(int age)
{
    return GetAllByAge(age, e => e.ID);
}
于 2011-04-16T22:38:25.190 回答