C# 什么';是的System.Linq.Expressions.ExpressionVisitor.VisitExtension和System.Linq.Expressions.ExpressionType.Extension?

C# 什么';是的System.Linq.Expressions.ExpressionVisitor.VisitExtension和System.Linq.Expressions.ExpressionType.Extension?,c#,.net,linq,expression-trees,expressionvisitor,C#,.net,Linq,Expression Trees,Expressionvisitor,System.Linq.Expressions.ExpressionVisitor有一个名为VisitExtension的方法,它似乎除了调用正在访问的表达式上的VisitChildren方法之外,什么都不做 protected internal virtual Expression VisitExtension(Expression node) { return node.VisitChildren(this); } 我了解访问儿童的功能。我还理解,这个虚拟实现可以而且可能意味着被覆

System.Linq.Expressions.ExpressionVisitor
有一个名为
VisitExtension
的方法,它似乎除了调用正在访问的
表达式
上的
VisitChildren
方法之外,什么都不做

protected internal virtual Expression VisitExtension(Expression node)
{
    return node.VisitChildren(this);
}
我了解
访问儿童的功能。我还理解,这个虚拟实现可以而且可能意味着被覆盖。因此,我从这篇文章中收集到以下信息,这篇文章在措辞和简短的评论方面都很简洁:

访问扩展表达式的子级。 这可以被覆盖以访问或重写特定的扩展节点。 如果未重写,此方法将调用VisitChildren,这使节点有机会遍历其子节点。默认情况下,VisitChildren将尝试减少节点

我觉得这个解释没有帮助。具体来说,让我无法理解的短语是“或重写特定的扩展节点”

我理解它的其余部分,它涉及到表达式的缩减或分解成子表达式

同一名称空间中还有一个名为
ExpressionType
的枚举,我非常理解它的用途。但是在它的所有成员中,有一个名为
Extension
的成员,我无法将其映射到我目前知道的任何语法标记

同样令人沮丧的是,这本书简洁明了。它将值
扩展名
描述如下:

扩展表达式

很明显,这两个--
ExpressionType.Extension
ExpressionVisitor.VisitExtension
--是相关的


但什么是扩展?显然,正如显而易见的,扩展方法在这种情况下是没有位置的。表达式扩展在这里指的是哪个语法工件?

在这种情况下,扩展并不代表任何类型的内置语法,而是对应于应用程序可以定义和分配任意含义的节点

在应用程序中操纵表达式树时,该概念非常有用,因为这些扩展节点可以完全集成到正常的表达式树中

例如,我使用节点类型
ExpressionType.Extension
定义了
System.Linq.Expressions.Expression
的子类,以便扩展实体框架的Linq,以了解我公司使用的复合主键的类型

扩展表达式类型很有用,因为它允许我使用两步方法:

  • 在第一步中,表达式访问者将该组合键的每个外观正则化为我的自定义类型的节点
  • 在第二步中,负责将表达式转换为实体框架能够处理的内容的表达式访问者可以简单地检查类型
示例:假设我编写了LINQ代码:

from e in table where e.FirstKey == e.SecondKey select e;
其中,
FirstKey
SecondKey
都是复合数据库键(也就是说,
FirstKey
有两个数据库列
FirstKey1
FirstKey2
,对于
SecondKey
,也同样如此)

然后第一个访问者将
e.FirstKey
e.SecondKey
转换为
CustomKeyExpression
节点,从功能上将其转换为:

from e in table where Key(e.FirstKey1, e.FirstKey2) == Key(e.SecondKey1, e.SecondKey2) select e;
在第二个访问者中,当我访问
EqualExpression
时,我会检查两个孩子是否都是
CustomKeyExpression
s,并进行适当的转换:

from e in table where e.FirstKey1 == e.SecondKey1 && e.FirstKey2 == e.SecondKey2;

你看过吗?谢谢你,杰伦。从URL的读取方式来看,它似乎可以很好地回答我的问题。但是,我不能打开它。事实上,在相当长的一段时间内,可能几个月后,我一直无法打开重新动议项目的网站。我能在去年早些时候打开它。对于任何感兴趣的人来说,@Jeroenmoster提供的链接的最后一个互联网存档版本是谢谢你,Jean。解释得很好。