關於委托與事件,網上介紹得非常之多,在此不再贅述,本人最近需要搗鼓一些委托,因而對委托進行一定的尋根究底,故用反射把委托的成員揪出來,且看如下代碼:
delegate void DelegateDemo(); static event DelegateDemo delHandle; static void Main() { delHandle += new DelegateDemo(MyDelegate_delHandle); MemberInfo[] mis = delHandle.GetType().GetMembers(); foreach (var item in mis) { Console.WriteLine(item.Name+" " + item.ToString()); } } static void MyDelegate_delHandle() { throw new NotImplementedException(); }
貼出來才發現是獲取事件的類型,當然用此與委托進行對比的話只需要將delHandle.GetType()改為typeof(DelegateDemo),對比下會發現什么呢?好奇的童鞋自行試驗了哈。
上述輸出也許看的不是很直觀,我們可以斷點進去監視,看下圖,顯示得非常直觀,可以看到其內部公共的成員方法和屬性了啊。
另外說一點我的個人看法,委托是一個類,那么事件是什么呢?我認為事件就是類的一個對象,看這個反射獲取類型的方式與平常反射一個類反射一個對象就是完全一致的呵。
關於委托,添加一點,這是以前未曾注意的:委托協變——支持返回值協變;逆變——支持參數, 但傳參仍然以委托定義的參數為准
好了,以上是反射方式分析委托和事件,當然還有更底層的分析——IL,請看這篇園友貓行天下提供的博文http://www.cnblogs.com/slayercat/archive/2012/09/27/2705786.html