private void AddNewMenuItem(ToolStripMenuItem menu, BuilderMenuItem root) { foreach (var item in root.Items) { var mi = new ToolStripMenuItem(item.Name); mi.Tag = item.Builder; mi.Click += BuilderMenuItemClick; menu.DropDownItems.Add(mi); AddNewMenuItem(mi, item); } }
private void LoadPlugins() { var files = Directory.GetFiles("Plugins", "*.dll", SearchOption.AllDirectories); var buildersMenu = new ToolStripMenuItem("Builders"); BuilderMenuItem root = new BuilderMenuItem(); menuStrip.Items.Add(buildersMenu); foreach (var f in files) { Assembly a = Assembly.LoadFrom(f); var builderTypes = a.GetTypes().Where(o => IsSubclassOfRawGeneric(typeof(Builder <>), o)); foreach (var bt in builderTypes) { var builder = Activator.CreateInstance(bt) as BuilderBase; var pathChunks = builder.BuilderPath.Split('/'); var currentRoot = root; foreach (var chunk in pathChunks.Take(pathChunks.Length - 1)) { var existing = currentRoot.Items.FirstOrDefault(o => o.Name == chunk); if (existing == null) { currentRoot.Items.Add(new BuilderMenuItem() { Name = chunk }); } currentRoot = currentRoot.Items.FirstOrDefault(o => o.Name == chunk); } currentRoot.Items.Add(new BuilderMenuItem() { Builder = builder, Name = pathChunks.Last(), }); } } AddNewMenuItem(buildersMenu, root); }