C#中事件的動態(tài)調(diào)用實現(xiàn)方法
本文實例講述了C#動態(tài)調(diào)用事件的方法。一般來說,傳統(tǒng)的思路是,通過Reflection.EventInfo獲得事件的信息,然后使用GetRaiseMethod方法獲得事件被觸發(fā)后調(diào)用的方法,再使用MethodInfo.Invoke來調(diào)用以實現(xiàn)事件的動態(tài)調(diào)用。
但是很不幸的,Reflection.EventInfo.GetRaiseMethod方法始終返回null。這是因為,C#編譯器在編譯并處理由event關(guān)鍵字定義的事件時,根本不會去產(chǎn)生有關(guān)RaiseMethod的元數(shù)據(jù)信息,因此GetRaiseMethod根本無法獲得事件觸發(fā)后的處理方法。Thottam R. Sriram 在其Using SetRaiseMethod and GetRaiseMethod and invoking the method dynamically 一文中簡要介紹了這個問題,并通過Reflection.Emit相關(guān)的方法來手動生成RaiseMethod,最后使用常規(guī)的GetRaiseMethod來實現(xiàn)事件觸發(fā)后的方法調(diào)用。這種做法比較繁雜。
以下代碼是一個簡單的替代方案,同樣可以實現(xiàn)事件的動態(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è)計有所幫助
相關(guān)文章
Dynamic和Var的區(qū)別及dynamic使用詳解
C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的,下面通過本文給大家介紹Dynamic和Var的區(qū)別及如何正確使用dynamic,需要的朋友參考下2016-01-01C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09C#實現(xiàn)gRPC服務(wù)和調(diào)用示例詳解
gRPC?是一種與語言無關(guān)的高性能遠程過程調(diào)用?(RPC)?框架,這篇文章主要為大家詳細介紹了C#如何實現(xiàn)gRPC服務(wù)和調(diào)用,需要的可以參考一下2024-01-01C#實現(xiàn)字母與ASCII碼互相轉(zhuǎn)換
ASCII是基于拉丁字母的編碼系統(tǒng),也是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),本文主要為大家詳細介紹了如何使用C#實現(xiàn)字母與ASCII碼互轉(zhuǎn),需要的可以參考下2024-01-01