以前一直使用C#2.0,這次為了開發MongoDB的工具,使用了C#4.0.因為用慣了VB,這個也是C#4的處女作了。
一直知道C#的擴展方法,今天第一次使用。。。。。。
現在在做的工具,是恨傳統的桌面工具,在制作中發現上下文菜單項和主菜單項ToolStripMenuItem沒有Clone的功能,這樣的話,無法實現上下文菜單項和主菜單項的共用。
看了網上的一些例子,無非是做一個繼承ToolStripMenuItem的新類,然後Copy屬性。我的方法是做擴展方法,思路也差不多:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Reflection;
7 using System.ComponentModel;
8 namespace MagicMongoDBTool.Module
9 {
10 static class CloneMeunToolItem
11 {
12 /// <summary>
13 /// 復制菜單項目
14 /// </summary>
15 /// <param name="OrgMenuItem"></param>
16 /// <returns></returns>
17 public static ToolStripMenuItem Clone(this ToolStripMenuItem OrgMenuItem)
18 {
19 ToolStripMenuItem CloneMenuItem = new ToolStripMenuItem();
20 //!!!typeof的參數必須是ToolStripMenuItem的基類!!!如果使用Control則不能取到值!!!
21 ///感謝CSDN網友beargo在帖子【如何獲取事件已定制方法名?】裡面的提示,網上的例子沒有說明這個問題
22 ///坑爹啊。。。。。。。。
23 Delegate[] _List = GetObjectEventList(OrgMenuItem, "EventClick", typeof(ToolStripItem));
24 CloneMenuItem.Click += new EventHandler(
25 (x, y) => { _List[0].DynamicInvoke(x,y); }
26 );
27 CloneMenuItem.Text = OrgMenuItem.Text;
28 return CloneMenuItem;
29 }
30
31 /// <summary>
32 /// 獲取控件事件 [email protected] qq:116149
33 /// </summary>
34 /// <param name="p_Control">對象</param>
35 /// <param name="p_EventName">事件名EventClick EventDoubleClick 這個需要看control.事件 是哪個類的名字是什麼</param>
36 /// <param name="p_EventType">如果是WINFROM控件 使用typeof(Control)</param>
37 /// <returns>委托列</returns>
38 public static Delegate[] GetObjectEventList(object p_Object, string p_EventName, Type p_EventType)
39 {
40 PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
41 if (_PropertyInfo != null)
42 {
43 object _EventList = _PropertyInfo.GetValue(p_Object, null);
44 if (_EventList != null && _EventList is EventHandlerList)
45 {
46 EventHandlerList _List = (EventHandlerList)_EventList;
47 FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
48 if (_FieldInfo == null) return null;
49 Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
50 if (_ObjectDelegate == null) return null;
51 return _ObjectDelegate.GetInvocationList();
52 }
53 }
54 return null;
55 }
56 }
57 }
只是我想說一下,網絡上很多代碼,包括CSDN上的很多回答。基本上使用了同樣的例子。
不過對於這個例子的解釋完全沒有。特別是哪個坑爹的如果是WINFROM控件 使用typeof(Control)。如果照著這個寫的話,菜單項目是沒有辦法使用的。
正確的說法是 使用控件的 基類。
下面報告一下MongoDB工具的進度:
今天完成了數據3種方法展示的功能
網站地址 http://www.magicdict.com/ 有興趣的寫信給我 root#magicdict.com [convert # to @ ] 或者加MSN [email protected]