C#中事件的動(dòng)態(tài)調(diào)用實(shí)現(xiàn)方法
本文實(shí)例講述了C#動(dòng)態(tài)調(diào)用事件的方法。一般來說,傳統(tǒng)的思路是,通過Reflection.EventInfo獲得事件的信息,然后使用GetRaiseMethod方法獲得事件被觸發(fā)后調(diào)用的方法,再使用MethodInfo.Invoke來調(diào)用以實(shí)現(xiàn)事件的動(dòng)態(tài)調(diào)用。
但是很不幸的,Reflection.EventInfo.GetRaiseMethod方法始終返回null。這是因?yàn)?,C#編譯器在編譯并處理由event關(guān)鍵字定義的事件時(shí),根本不會(huì)去產(chǎn)生有關(guān)RaiseMethod的元數(shù)據(jù)信息,因此GetRaiseMethod根本無法獲得事件觸發(fā)后的處理方法。Thottam R. Sriram 在其Using SetRaiseMethod and GetRaiseMethod and invoking the method dynamically 一文中簡要介紹了這個(gè)問題,并通過Reflection.Emit相關(guān)的方法來手動(dòng)生成RaiseMethod,最后使用常規(guī)的GetRaiseMethod來實(shí)現(xiàn)事件觸發(fā)后的方法調(diào)用。這種做法比較繁雜。
以下代碼是一個(gè)簡單的替代方案,同樣可以實(shí)現(xiàn)事件的動(dòng)態(tài)調(diào)用。具體代碼如下:
public event EventHandler<EventArgs> MyEventToBeFired; public void FireEvent(Guid instanceId, string handler) { // Note: this is being fired from a method with in the same class that defined the event (i.e. "this"). EventArgs e = new EventArgs(instanceId); MulticastDelegate eventDelagate = (MulticastDelegate)this .GetType() .GetField(handler, BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(this); Delegate[] delegates = eventDelagate.GetInvocationList(); foreach (Delegate dlg in delegates) { dlg.Method.Invoke( dlg.Target, new object[] { this, e } ); } } FireEvent(new Guid(), "MyEventToBeFired");
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助
相關(guān)文章
Dynamic和Var的區(qū)別及dynamic使用詳解
C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動(dòng)態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的,下面通過本文給大家介紹Dynamic和Var的區(qū)別及如何正確使用dynamic,需要的朋友參考下2016-01-01C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09C#實(shí)現(xiàn)gRPC服務(wù)和調(diào)用示例詳解
gRPC?是一種與語言無關(guān)的高性能遠(yuǎn)程過程調(diào)用?(RPC)?框架,這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)gRPC服務(wù)和調(diào)用,需要的可以參考一下2024-01-01基于C#制作一個(gè)飛機(jī)大戰(zhàn)小游戲的全過程
飛機(jī)大戰(zhàn)小游戲詳細(xì)大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于基于C#制作一個(gè)飛機(jī)大戰(zhàn)小游戲的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C#實(shí)現(xiàn)字母與ASCII碼互相轉(zhuǎn)換
ASCII是基于拉丁字母的編碼系統(tǒng),也是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),本文主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)字母與ASCII碼互轉(zhuǎn),需要的可以參考下2024-01-01C#使用位域技術(shù)進(jìn)行對象二進(jìn)制序列化優(yōu)
在操作系統(tǒng)中,進(jìn)程信息對于系統(tǒng)監(jiān)控和性能分析至關(guān)重要,這個(gè)過程中,如何將捕獲到的進(jìn)程對象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并進(jìn)行優(yōu)化,以減小數(shù)據(jù)包的大小,成為了一個(gè)關(guān)鍵問題,下面我們就來看看如何使用位域技術(shù)對C#對象進(jìn)行二進(jìn)制序列化優(yōu)化吧2024-01-01