public void Add <S>(SystemUri.SchemeSegment scheme) where S : CatalogSubject <S>, new() { LeadingSubjects[typeof(S)] = new S(); var descendents = Descendents <S>(scheme).ToDictionary(d => d.GetType()); SubjectsByType.AddRange(descendents); foreach (var d in descendents) { SubjectsByUrn.Add(d.Value.Urn, d.Value); } }
static IEnumerable <CatalogSubject> Descendents(CatalogSubject parent, SystemUri.SchemeSegment scheme) { foreach (var childType in parent.GetType().GetNestedTypes()) { var child = (CatalogSubject)Activator.CreateInstance(childType, parent); yield return(child); foreach (var grandchild in Descendents(child, scheme)) { yield return(grandchild); } } }
public void RegisterSubject <S>(SystemUri.SchemeSegment scheme) where S : CatalogSubject <S>, new() => CatalogState.Add <S>(scheme);
static IEnumerable <CatalogSubject> Descendents <S>(SystemUri.SchemeSegment scheme) where S : CatalogSubject, new() => Descendents(new S(), scheme);