假設有 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...