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

发布于 2024-11-02 06:58:31 字数 219 浏览 0 评论 0原文

假设我有以下函数,

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

我想传递表达式的默认参数,例如 OrderBy = e=>e.ID
这样如果这个参数没有定义,默认是按照id排序。
这怎么可能?

suppose i have the following function

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

i want to pass a default parameter for the Expression like OrderBy = e=>e.ID
so that if this parameter is not defined, the default is sorting by id.
how is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜未央樱花落 2024-11-09 06:58:31

这里有两个问题:

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

There are two problems here:

  • e => e.ID may not be valid for the T that's provided
  • You can only use constants in default parameters

You can sort of work round this by doing:

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

(assuming the type of ID is int)

... but the cast will fail if T isn't int. Note that the double cast is for the "inner" part to originally tell the compiler what expression tree you want to convert the lambda expression to, and the "outer" part is to then force that to be the appropriate expression tree type for T.

I'd be tempted to use overloading instead:

public Whatever GetAllByAge(int age)
{
    return GetAllByAge(age, e => e.ID);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文