public abstract class ExpressionVisitor {
protected ExpressionVisitor() {}

protected virtual Expression Visit(Expression exp) {
if (exp == null)
	return exp;
switch (exp.NodeType) {
case ExpressionType.Negate:
case ExpressionType.NegateChecked:
case ExpressionType.Not:
case ExpressionType.Convert:
case ExpressionType.ConvertChecked:
case ExpressionType.ArrayLength:
case ExpressionType.Quote:
case ExpressionType.TypeAs:
case ExpressionType.UnaryPlus:
	return this.VisitUnary((UnaryExpression) exp);
case ExpressionType.Add:
case ExpressionType.AddChecked:
case ExpressionType.Subtract:
case ExpressionType.SubtractChecked:
case ExpressionType.Multiply:
case ExpressionType.MultiplyChecked:
case ExpressionType.Divide:
case ExpressionType.Modulo:
case ExpressionType.And:
case ExpressionType.AndAlso:
case ExpressionType.Or:
case ExpressionType.OrElse:
case ExpressionType.LessThan:
case ExpressionType.LessThanOrEqual:
case ExpressionType.GreaterThan:
case ExpressionType.GreaterThanOrEqual:
case ExpressionType.Equal:
case ExpressionType.NotEqual:
case ExpressionType.Coalesce:
case ExpressionType.ArrayIndex:
case ExpressionType.RightShift:
case ExpressionType.LeftShift:
case ExpressionType.ExclusiveOr:
case ExpressionType.Power:
	return this.VisitBinary((BinaryExpression) exp);
case ExpressionType.TypeIs:
	return this.VisitTypeIs((TypeBinaryExpression) exp);
case ExpressionType.Conditional:
	return this.VisitConditional((ConditionalExpression) exp);
case ExpressionType.Constant:
	return this.VisitConstant((ConstantExpression) exp);
case ExpressionType.Parameter:
	return this.VisitParameter((ParameterExpression) exp);
case ExpressionType.MemberAccess:
	return this.VisitMemberAccess((MemberExpression) exp);
case ExpressionType.Call:
	return this.VisitMethodCall((MethodCallExpression) exp);
case ExpressionType.Lambda:
	return this.VisitLambda((LambdaExpression) exp);
case ExpressionType.New:
	return this.VisitNew((NewExpression) exp);
case ExpressionType.NewArrayInit:
case ExpressionType.NewArrayBounds:
	return this.VisitNewArray((NewArrayExpression) exp);
case ExpressionType.Invoke:
	return this.VisitInvocation((InvocationExpression) exp);
case ExpressionType.MemberInit:
	return this.VisitMemberInit((MemberInitExpression) exp);
case ExpressionType.ListInit:
	return this.VisitListInit((ListInitExpression) exp);
default:
throw new Exception(
string.Format(
"Neoeten typ vrazu: '{0}'",
exp.NodeType));
}
}
// zbytek kdu vynechn ...
}
