public void LookupTypes(IEnumerable <Assembly> assemblies) { foreach (var assembly in assemblies) { #if !SILVERLIGHT var referencedAssemblies = assembly.GetReferencedAssemblies(); if (ShouldProcess(assembly.GetName()) == false && referencedAssemblies.Any(ShouldProcess) == false) { continue; } #endif var pathToRoot = new Stack <Type>(); // ReSharper disable AssignNullToNotNullAttribute foreach (var type in assembly.GetLoadableTypes().Where(t => t.IsSubclassOf(_rootType))) { if (_treeItemMap.ContainsKey(type)) { continue; } var current = type; pathToRoot.Push(current); while (true) { TypeTreeItem parentTreeItem; current = current.BaseType; if (_treeItemMap.TryGetValue(current, out parentTreeItem)) { break; } pathToRoot.Push(current); } while (pathToRoot.Count > 0) { var peek = pathToRoot.Pop(); _treeItemMap[peek] = new TypeTreeItem(peek, _treeItemMap[current]); current = peek; } } // ReSharper restore AssignNullToNotNullAttribute } }
public TypeTree(Type rootType) { _rootType = rootType; _rootTypeAssembly = new AssemblyName(_rootType.Assembly.FullName); _treeItemMap[_rootType] = new TypeTreeItem(); }
public TypeTreeItem(Type type, TypeTreeItem baseType) { Type = type; BaseType = baseType; BaseType.DerivedTypesInt.Add(this); }