菲傭WPF 7 再造輪子 事件的訂閱和發布

2022-07-27 23:27:17 字數 3252 閱讀 9447

關於事件的訂閱和發布,相信網上已經有很多版本了。基本的原理就是先訂閱事件,將訂閱的事件儲存到特定的容器中,接著,當發布事件的時候,直接呼叫的儲存的事件。

.net不是已經提供了event,為什麼還要做事件的訂閱和發布。

我個人的理解是高度封裝自己的事件,這樣**簡潔美觀,並且易於維護和擴充套件。

我採用了靜態的容器來儲存訂閱的事件,這樣可以跨組建或專案的程式集。

首先我們要定義我們自己的event事件

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

using

system.windows;

namespace

fyframework.event

//////

publish the event

/// ///

publish's function's parameters

public

virtual

void publish(callmode callmode,object

objs) );}

else

); }

}#endregion

}}

我們自定義的eventbase  只有兩個方法 subscribe和publish

subscribe用來訂閱事件(我們這裡泛指 無返回值的函式,有返回值的函式我會繼續在下個版本加入)

至於fyevent只是個空的抽象類,就是為了實現eventbase的泛型,有好的辦法,大家通知我。

這裡我們會看到eventdispathcher類,主要是個list用來村粗action(無返回函式的委託)

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

fyframework.event

}//////

remove event

/// ///

event delegate object

public

void

removeevent(fyweakreference weakreference)

}//////

get event

/// ///

public listgetevent()

#endregion

}}

addevent就是用來新增action

在這裡又會有fyweakreference類,就是就是action的weakreference物件。

為什麼用weakreference,用弱引用是盡量的當事件太多時,對於記憶體的壓力。

weakreference的**。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.reflection;

using

system.text;

using

system.threading.tasks;

namespace

fyframework.event

public fyweakreference(delegate action, bool

iskeepalive)

else

}#endregion

#region

<< method >>

//////get delegate

/// ///

delegate

public

delegate getaction()

object obj =weakreference.target;

if (obj != null

)

return

delegate.createdelegate(actiontype, obj, methodinfo);

return

null

; }

#endregion

}}

接著就是我們eventmanager.

using

system;

using

system.collections.generic;

using

system.componentmodel.composition;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

fyframework.event

}

using

system;

using

system.collections.generic;

using

system.componentmodel.composition;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

fyframework.event

}#endregion

}}

這eventmanager我用字典來儲存我們自定義的事件。

getevent泛型來取得對應的事件物件,來進行訂閱和發布。

整個訂閱和發布,其實就是先儲存event,再呼叫event對應的action

目前這個事件小框架,還不太完善,先發出來,大家討論下,希望你們也可以發布自己的事件訂閱和發布框架。