private int GetMaxObjectDepth(Expression expression, int currentDepth) { string expressionType; if (currentDepth == 0) //if is root element { //Frameworks can add theType { dynamicType} - strip out the {dynamic type} expressionType = GeneratorHelper.GetSubClassFromType(expression.Type); } else { //members of objects have a type of: object { theType } - strip out object { } expressionType = GeneratorHelper.GetBaseClassFromType(expression.Type); } //No members and can't be resolved to a single type (equivalent of having no members) if (expression.DataMembers.Count > 0 && GeneratorHelper.IsSerializable(expression.Name) && !GeneratorHelper.CanBeExpressedAsSingleType(expressionType)) { List <Expression> dataMembers = expression.DataMembers.Cast <Expression>().ToList(); for (int i = 0; i < dataMembers.Count; i++) { Expression currentMember = dataMembers[i]; //Add to current list, bring base members up one level if (GeneratorHelper.IsBase(currentMember)) { dataMembers.AddRange(currentMember.DataMembers.Cast <Expression>()); } else { if (_maxDepth >= _cutoff) { return(_maxDepth); //Stop calculating } if (currentDepth > _maxDepth) { _maxDepth = currentDepth; } bool isValid = _ruleSetValidator.ValidateAllSubRules(expressionType, currentMember.Name); if (isValid) { GetMaxObjectDepth(currentMember, currentDepth + 1); } } } } return(_maxDepth); }