欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中事件的動態(tài)調(diào)用實現(xiàn)方法

 更新時間:2014年09月06日 09:49:33   投稿:shichen2014  
這篇文章主要介紹了C#中事件的動態(tài)調(diào)用實現(xiàn)方法,對比傳統(tǒng)思路優(yōu)劣給出了一個新的解決方案,需要的朋友可以參考下

本文實例講述了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)文章

  • 關(guān)于C# 類的封裝詳情

    關(guān)于C# 類的封裝詳情

    C#中可使用類來達到數(shù)據(jù)封裝的效果,這樣就可以使數(shù)據(jù)與方法封裝成單一元素,以便于通過,接下來小編將為大家詳細介紹,需要的朋友可以參考一下
    2021-10-10
  • Dynamic和Var的區(qū)別及dynamic使用詳解

    Dynamic和Var的區(qū)別及dynamic使用詳解

    C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的,下面通過本文給大家介紹Dynamic和Var的區(qū)別及如何正確使用dynamic,需要的朋友參考下
    2016-01-01
  • 基于C#編寫一個合并多個Word文檔的工具

    基于C#編寫一個合并多個Word文檔的工具

    這篇文章主要為大家詳細介紹了如何使用C#編寫一個小工具,可以實現(xiàn)把多個word文檔進行合并成一個word文檔,感興趣的小伙伴可以了解下
    2024-02-02
  • C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列)

    C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列)

    這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • C#實現(xiàn)gRPC服務(wù)和調(diào)用示例詳解

    C#實現(xiàn)gRPC服務(wù)和調(diào)用示例詳解

    gRPC?是一種與語言無關(guān)的高性能遠程過程調(diào)用?(RPC)?框架,這篇文章主要為大家詳細介紹了C#如何實現(xiàn)gRPC服務(wù)和調(diào)用,需要的可以參考一下
    2024-01-01
  • 基于C#制作一個飛機大戰(zhàn)小游戲的全過程

    基于C#制作一個飛機大戰(zhàn)小游戲的全過程

    飛機大戰(zhàn)小游戲詳細大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于基于C#制作一個飛機大戰(zhàn)小游戲的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C#實現(xiàn)字母與ASCII碼互相轉(zhuǎn)換

    C#實現(xiàn)字母與ASCII碼互相轉(zhuǎn)換

    ASCII是基于拉丁字母的編碼系統(tǒng),也是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),本文主要為大家詳細介紹了如何使用C#實現(xiàn)字母與ASCII碼互轉(zhuǎn),需要的可以參考下
    2024-01-01
  • C#使用位域技術(shù)進行對象二進制序列化優(yōu)

    C#使用位域技術(shù)進行對象二進制序列化優(yōu)

    在操作系統(tǒng)中,進程信息對于系統(tǒng)監(jiān)控和性能分析至關(guān)重要,這個過程中,如何將捕獲到的進程對象轉(zhuǎn)換為二進制數(shù)據(jù),并進行優(yōu)化,以減小數(shù)據(jù)包的大小,成為了一個關(guān)鍵問題,下面我們就來看看如何使用位域技術(shù)對C#對象進行二進制序列化優(yōu)化吧
    2024-01-01
  • C#基于XNA生成隨機顏色的方法

    C#基于XNA生成隨機顏色的方法

    這篇文章主要介紹了C#基于XNA生成隨機顏色的方法,涉及XNA Color類的使用技巧,需要的朋友可以參考下
    2015-06-06
  • 深入分析C#中處理和鍵盤相關(guān)事件的詳解

    深入分析C#中處理和鍵盤相關(guān)事件的詳解

    本篇文章是對C#中處理和鍵盤相關(guān)的事件進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論