2011-04-16 70 views
2

假设我有以下功能如何传递表达式树的默认参数?

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

我想传递默认参数等的OrderBy = E => e.ID
,使得如果没有定义该参数时,默认被排序的表达ID。
这怎么可能?

回答

4

有两个问题在这里:

  • 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投将失败。请注意,对于“内部”部分来说,双重强制转换最初会告诉编译器您想要将该lambda表达式转换为哪个表达式树,而“外部”部分则是强制将其作为T的适当表达式树类型。

我会尝试使用超载而不是:

public Whatever GetAllByAge(int age) 
{ 
    return GetAllByAge(age, e => e.ID); 
} 
+0

哦,我错过了泛型参数!最好与超负荷一起去。 – 2011-04-16 22:40:54

+0

很好的答案,谢谢:) – Karim 2011-04-16 23:18:56

相关问题