C 反射呼叫私有事件

2022-01-14 17:45:46 字數 1811 閱讀 6889

假設有 a 類的**定義了乙個私有的事件

class

aremove

}}

通過反射可以拿到 a 的事件 fx 但是無法直接新增事件

var eventinfo =

typeof

(a).

getevent

("fx"

, bindingflags.instance | bindingflags.nonpublic)

;

如果這時直接呼叫 addeventhandler 就會出現下面異常

var eventinfo =

typeof

(a).

getevent

("fx"

, bindingflags.instance | bindingflags.nonpublic)

;var a =

newa()

; eventinfo.

addeventhandler

(a,new

eventhandler

(fx));

voidfx(

object sender,

eventargs e)

system.invalidoperationexception:「由於不存在此事件的公共新增方法,因此無法新增該事件處理程式。」
解決的方法是呼叫 getaddmethod 的方法請看下面

var eventinfo =

typeof

(a).

getevent

("fx"

, bindingflags.instance | bindingflags.nonpublic)

;var addfx = eventinfo.

getaddmethod

(true);

var removefx = eventinfo.

getremovemethod

(true);

var a =

newa()

; addfx.

invoke

(a,new

);removefx.

invoke

(a,new

);voidfx(

object sender,

eventargs e)

參見

如果可能遇到型別轉換的異常system.argumanetexception:'object of type 'system.eventhandler1[system.eventargs]' cannot be converted to type 'system.eventhandler'.,請看.net/c# 使用反射註冊事件 - walterlv

更多反射請看

win10 uwp 反射

.net core/framework 建立委託以大幅度提高反射呼叫的效能 - walterlv

設定 .net native 執行時指令以支援反射(尤其適用於 uwp) - walterlv

.net/c# 使用反射呼叫含 ref 或 out 引數的方法 - walterlv

.net/c# 推薦乙個我設計的快取型別(適合快取反射等耗效能的操作,附用法) - walterlv

2019 11 29 C 反射呼叫私有事件

title author date createtime categories c 反射呼叫私有事件 lindexi 2019 11 29 08 51 13 0800 2018 09 19 20 44 19 0800 c 反射 假設有 a 類的 定義了乙個私有的事件 class a remove 通...

2019 8 30 C 反射呼叫私有事件

title author date createtime categories c 反射呼叫私有事件 lindexi 2019 08 30 08 52 57 0800 2018 09 19 20 44 19 0800 c 反射 假設有 a 類的 定義了乙個私有的事件 class a remove 通...

c 反射呼叫事件

這裡有個例子 這個例子反射呼叫的是靜態的action。這裡最後寫了三點需要注意的,我覺得很對。委託其實是個字段,要用getfield來獲取 這裡的第乙個答案。stackoverflow裡的,這個就是反射呼叫事件。主要差別在反射的篩選條件 typeof myclass getfields bindin...