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

2022-01-13 17:40:48 字數 1760 閱讀 9830

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

}}

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

var

eventinfo

=typeof(a).getevent("fx"

, bindingflags.instance

|bindingflags.nonpublic);

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

var

eventinfo

=typeof(a).getevent("fx"

, bindingflags.instance

|bindingflags.nonpublic);

vara=

newa();

eventinfo.addeventhandler(a, new

eventhandler(fx));

void

fx(object

sender, eventargs

e)

system.invalidoperationexception:「由於不存在此事件的公共新增方法,因此無法新增該事件處理程式。」

解決的方法是呼叫 getaddmethod 的方法請看下面

var

eventinfo

=typeof(a).getevent("fx"

, bindingflags.instance

|bindingflags.nonpublic);

varaddfx

=eventinfo.getaddmethod(true);

varremovefx

=eventinfo.getremovemethod(true);

vara=

newa();

addfx.invoke(a, new );

removefx.invoke(a, new );

void

fx(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

C 反射呼叫私有事件

假設有 a 類的 定義了乙個私有的事件 class aremove 通過反射可以拿到 a 的事件 fx 但是無法直接新增事件 var eventinfo typeof a getevent fx bindingflags.instance bindingflags.nonpublic 如果這時直接呼...

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 通...

利用反射機制呼叫私有方法

步驟1 獲取到當前執行緒的類載入器 classloader classloader thread.currentthread getcontextclassloader 步驟2 用類載入器獲取的class物件 class clazz classloader.loadclass com.wxw.tes...