private string getShortcutText(ToolStripMenuItem mi) { var t= (string)mi.GetType().InvokeMember( @"GetShortcutText", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, mi, new object[] { }); return t; }
// http://stackoverflow.com/questions/1121441/c-sharp-addeventhandler-using-reflection private void addmenu(string name, IEnumerable<string> itemarray, object classobject) { var menu = new ToolStripMenuItem(name); bool merge = typeof (MainForm) != classobject.GetType(); if (merge) menu.MergeAction = MergeAction.MatchOnly; foreach (string itemtext in itemarray) { if (itemtext == "Seperator") menu.DropDownItems.Add(new ToolStripSeparator()); else { var item = new ToolStripMenuItem {Text = itemtext}; EventInfo eventinfo = item.GetType().GetEvent("Click"); // Zoek de string.Format("{0}_Click", itemtext.Replace(" ", "") methode van classobject MethodInfo methodinfo = classobject.GetType().GetMethod(string.Format("{0}_Click", itemtext.Replace(" ", ""))); if (methodinfo == null) // Als die niet bestaat. item.Enabled = false; else // Anders, voeg een EventHandler toe van het Click event naar die methode. eventinfo.AddEventHandler(item, Delegate.CreateDelegate(eventinfo.EventHandlerType, classobject, methodinfo)); if (merge) item.MergeAction = MergeAction.Replace; menu.DropDownItems.Add(item); itemdictionary.Add(item.Text, item); } } Items.Add(menu); }