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); }