国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 02:26:38
字體:
供稿:網(wǎng)友

本文實例講述了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è)計有所幫助

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 夏河县| 长治市| 吴旗县| 龙里县| 茂名市| 千阳县| 象山县| 石渠县| 湘西| 获嘉县| 大宁县| 鲁山县| 白水县| 穆棱市| 通江县| 乌鲁木齐县| 泸溪县| 铜梁县| 乐业县| 宁国市| 德庆县| 泉州市| 元阳县| 贵南县| 衡水市| 卓资县| 当涂县| 牡丹江市| 宜兴市| 湛江市| 库尔勒市| 绥江县| 和田县| 津南区| 韶关市| 吉水县| 鸡东县| 香港 | 海林市| 温州市| 额尔古纳市|