請考慮這種情況。我有一個對象,讓我們叫它...... Foo。 Foo提出了一個名爲「Loaded」的簡單事件。作爲事件信息的一部分,消費者需要知道哪個foo對象引發了事件。我們的團隊採用了以下模式。C#簡單事件提升 - 使用「發件人」與自定義EventArgs
1)創建一個繼承自EventArgs的新類 - 例如, FooEventArgs:System.EventArgs。
2)將Foo類型的屬性添加到FooEventArgs中,該屬性通過構造函數傳入。
3)使用事件處理程序的通用版本聲明事件,所以
public event EventHandler<FooEventArgs> Loaded;
4)提高從Foo類具有以下簽名的事件:
Loaded(this, new FooEventArgs(this));
本質上講這確實是使得「發件人」成爲foo對象,但它也也將foo對象引用放入事件參數中作爲強類型屬性。
這樣做的一個好處是,沒有人在處理事件時不必擔心投射「發件人」,這會降低事件消費者與事件提升者之間的耦合度。另一個「優點」是,如果事件提升者的類型必須改變,並且因此強類型屬性(希望永不會發生),那麼不是簡單地在代碼開始失敗時拋出它爲空, API實際上會中斷,因此它可以在編譯時修復。
對我來說,這種模式似乎可能是矯枉過正。他們是否應該更多地信任「sender」參數,並且拋棄自定義事件參數?我的團隊認爲沒有人真的使用sender參數。傳遞引發事件的對象的最佳做法是什麼?
編輯:到目前爲止的很好的反饋,我會離開這個開放一天左右,然後我接受一個。
對於另一種方法來此,你可能想看看「事件簽名在.NET中 - 使用強類型的「發件人」?這裏:http://stackoverflow.com/questions/1046016/event-signature-in-net-using-a-strong-typed-sender – 2009-08-23 13:26:45