private static IEnumerable <Expression> GetChildren(MemberBinding binding)
        {
            switch (binding.BindingType)
            {
            case MemberBindingType.Assignment:
                yield return(((MemberAssignment)binding).Expression);

                break;

            case MemberBindingType.MemberBinding:
                foreach (Expression child in ExpressionExtensions.GetChildren((IEnumerable <MemberBinding>)((MemberMemberBinding)binding).Bindings))
                {
                    yield return(child);
                }
                break;

            case MemberBindingType.ListBinding:
                using (IEnumerator <Expression> enumerator = ExpressionExtensions.GetChildren((IEnumerable <ElementInit>)((MemberListBinding)binding).Initializers).GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        Expression child = enumerator.Current;
                        yield return(child);
                    }
                    break;
                }
            }
        }
        public static IEnumerable <Expression> GetChildren(this Expression exp)
        {
            switch (exp)
            {
            case UnaryExpression _:
                yield return(((UnaryExpression)exp).Operand);

                break;

            case BinaryExpression _:
                yield return(((BinaryExpression)exp).Left);

                yield return(((BinaryExpression)exp).Right);

                yield return((Expression)((BinaryExpression)exp).Conversion);

                break;

            case TypeBinaryExpression _:
                yield return(((TypeBinaryExpression)exp).Expression);

                break;

            case ConditionalExpression _:
                yield return(((ConditionalExpression)exp).Test);

                yield return(((ConditionalExpression)exp).IfTrue);

                yield return(((ConditionalExpression)exp).IfFalse);

                break;

            case MemberExpression _:
                yield return(((MemberExpression)exp).Expression);

                break;

            case MethodCallExpression _:
                yield return(((MethodCallExpression)exp).Object);

                foreach (Expression expression in ((MethodCallExpression)exp).Arguments)
                {
                    yield return(expression);
                }
                break;

            case LambdaExpression _:
                yield return(((LambdaExpression)exp).Body);

                foreach (ParameterExpression parameter in ((LambdaExpression)exp).Parameters)
                {
                    yield return((Expression)parameter);
                }
                break;

            case NewExpression _:
                foreach (Expression expression in ((NewExpression)exp).Arguments)
                {
                    yield return(expression);
                }
                break;

            case NewArrayExpression _:
                foreach (Expression expression in ((NewArrayExpression)exp).Expressions)
                {
                    yield return(expression);
                }
                break;

            case InvocationExpression _:
                yield return(((InvocationExpression)exp).Expression);

                foreach (Expression expression in ((InvocationExpression)exp).Arguments)
                {
                    yield return(expression);
                }
                break;

            case MemberInitExpression _:
                yield return((Expression)((MemberInitExpression)exp).NewExpression);

                foreach (Expression child in ExpressionExtensions.GetChildren((IEnumerable <MemberBinding>)((MemberInitExpression)exp).Bindings))
                {
                    yield return(child);
                }
                break;

            case ListInitExpression _:
                yield return((Expression)((ListInitExpression)exp).NewExpression);

                foreach (Expression child in ExpressionExtensions.GetChildren((IEnumerable <ElementInit>)((ListInitExpression)exp).Initializers))
                {
                    yield return(child);
                }
                break;
            }
        }