我有一个关于解析表达式树的基本问题。
使用if语句来确定表达式的NodeType并相应地处理它,与调度表达式执行不同的Visitor方法之间有区别吗?
这也是正确的发送方式:
protected override Expression VisitMember(MemberExpression m)
{
if (m.Expression.NodeType == ExpressionType.Constant)
{
Expression e = (m.Expression as ConstantExpression);
this.Visit(e); // dispatches to VisitConstant() ?
}
}
对战:
protected override Expression VisitMember(MemberExpression m)
{
if (m.Expression.NodeType == ExpressionType.Constant)
{
//specific code to handle constant
}
}
顺便说一下,这是解析以下内容:
dbContext.Products.Where(x => x.ID == user.ProductID).AsEnumerable()
// user.FooID is 'MemberExpression'
NodeType与表达式的类型之间究竟有什么关系?我注意到有例如NodeTypes似乎没有可覆盖的访问者方法,这是正确的吗?
答案 0 :(得分:1)
某些表达式类型(如MemberInit
)在类与关联的ExpressionType
枚举值之间具有一对一的对应关系,而对于其他类型,该类更通用且与多个ExpressionType
相关{ {1}},与BinaryExpression
一样(可以是Add
,Divide
等。