private SifterMap resolveIndexedTypes() { var map = new SifterMap(); foreach (var(type, sifterPropertyInfoMap) in sifterMap) { var children = indexedTypes.Where(i => i.IsSubclassOf(type)); foreach (var childType in children) { if (map.TryAdd(childType, sifterPropertyInfoMap)) { continue; } map[childType].MergeWith(sifterPropertyInfoMap); } if (!map.TryAdd(type, sifterPropertyInfoMap)) { map[type].MergeWith(sifterPropertyInfoMap); } } return(map); }
private static TypeTree typeTree(SifterMap map) { var typeTree = new TypeTree(); foreach (var(type, _) in map) { const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy; var properties = type.GetProperties(bindingFlags); foreach (var property in properties) { var propertyType = property.PropertyType; if (map.Keys.Contains(propertyType)) { typeTree.Add((type, property.Name), propertyType); } } } return(typeTree); }