程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用擴展方法,讓菜單也可以Clone

使用擴展方法,讓菜單也可以Clone

編輯:C#入門知識

 

以前一直使用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]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved