private IEnumerable <Guid> InternalGetBaseTemplates(IBaseTemplates item, ISitecoreService service, HashSet <Guid> visitedSet, int depth, bool ignoreTemplate = false) { if (item == null || depth <= 0) { return(DefaultBaseTemplateArray); } // Check direct 'template' field, then base-templates, before finally recursing var baseTemplates = new[] { item.Template } .Concat((item.TemplateBaseTemplates ?? item.BaseTemplates) ?? Enumerable.Empty <Guid>()) .Where(id => !visitedSet.Contains(id)) .ToArray(); foreach (var id in baseTemplates) { // prevent traversal of cycles visitedSet.Add(id); } // Breadth first search (recursive) return(baseTemplates.Concat(baseTemplates.SelectMany(guid => InternalGetBaseTemplates(service.GetItem <IBaseTemplates>(guid), service, visitedSet, depth - 1)))); }
internal IEnumerable <Guid> GetBaseTemplates(IBaseTemplates item, ISitecoreService service, int depth = DefaultDepth, bool ignoreTemplate = false) { return(InternalGetBaseTemplates(item, service, new HashSet <Guid>(), depth, ignoreTemplate).Concat(new[] { new Guid(DefaultFallbackTemplateId) })); }