その1
方法 : 式ツリー ビジタを実装する | Microsoft Docsにこんなコードがあったので、
protected virtual Expression VisitBinary(BinaryExpression b) { Expression left = this.Visit(b.Left); Expression right = this.Visit(b.Right); Expression conversion = this.Visit(b.Conversion); if (left != b.Left || right != b.Right || conversion != b.Conversion) { if (b.NodeType == ExpressionType.Coalesce && b.Conversion != null) { return Expression.Coalesce(left, right, conversion as LambdaExpression); } else { return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method); } } return b; }
プログラミング作法の「自然な形の式を使おう*1」「多分岐の判定にはelse-ifを使おう*2」の法則を使って
protected Expression VisitBinary(BinaryExpression b) { Expression left = Visit(b.Left); Expression right = Visit(b.Right); Expression conversion = Visit(b.Conversion); if (left == b.Left && right == b.Right && conversion == b.Conversion) { return b; } else if (b.Conversion == null || b.NodeType != ExpressionType.Coalesce) { return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method); } else { return Expression.Coalesce(left, right, conversion as LambdaExpression); } }
としたんですけど、合ってますかね、これ…。*3