public static bool ExtractNullPropagationExpression(ConditionalExpression conditionalExpression, out List <Expression> nullTestExpressions, out Expression ifNotNullExpression)
        {
            if (conditionalExpression == null)
            {
                throw new ArgumentNullException("conditionalExpression");
            }

            nullTestExpressions = null;
            ifNotNullExpression = null;

            if (TryExtractTestTargets(conditionalExpression.Test, ref nullTestExpressions) == false)
            {
                return(false);
            }

            if (nullTestExpressions == null || nullTestExpressions.Count == 0)
            {
                return(false);
            }

            var ifFalseConst    = conditionalExpression.IfFalse as ConstantExpression;
            var ifTrueUnwrapped = conditionalExpression.IfTrue.NodeType == ExpressionType.Convert ? ((UnaryExpression)conditionalExpression.IfTrue).Operand : conditionalExpression.IfTrue;

            // try to detect null-propagation operation
            if (ifFalseConst == null || ifFalseConst.Value != null || ExpressionLookupVisitor.Lookup(conditionalExpression.IfTrue, nullTestExpressions) == false)
            {
                return(false);
            }

            ifNotNullExpression = ifTrueUnwrapped;
            return(true);
        }
        public static bool Lookup(Expression expression, List <Expression> lookupList)
        {
            var visitor = new ExpressionLookupVisitor(lookupList);

            visitor.Visit(expression);
            return(visitor.found == lookupList.Count);
        }