2016-03-02 40 views
1

跟進我的問題here如何從匿名定義的事件處理程序中提取「真實」目標?

根據所提出的意見 -

編譯器創建了一個假名類成員,重視它,就像你附加聲明的方法。

我不完全理解這是什麼意思,但我可以確認,如果說

Foo.Bar += (S, E) => { /*Code Goes Here*/ } 

,而不是我,而不是說

Foo.Bar += FooBar; 

private void FooBar(object sender, EventArgs e){ 
    /*Code Goes Here*/ 
} 

然後Event.Target變化從WhatIsThis.App.<>cWhatIsThis.App

這真棒,但我不能保證我會一直寫一個實際的方法來附加到事件處理程序。在我使用匿名方法的情況下,是否有一種方法可以提取目標,或者我只是使用定義的方法(我的意思是,我可以忍受這一點,但是如果存在的話一些高科技魔法,我可以用它來提取真正的目標,然後我就是爲了它)。

+0

使用第一個參數('sender')有什麼問題? – spender

+0

@spender問題在於,在某些情況下,發件人將爲空。無論如何,發件人並不意味着成爲目標。這就像是從我自己給自己發送一個包裹,不是嗎? – Will

+0

...只是趕上你之前的問題......忽略之前的評論。 – spender

回答

4

不完全理解這是什麼意思

讓我們解決您的理解。假設您有:

class C 
{ 
    int x; 
    void M(int y) 
    { 
    int z = GetZ(); 
    Func<int, int> f = q => q + x + y + z; 
    ... 

f是委託人。它有一個接收器和一個方法,它是接收器的一種方法。 (注意,這實際上並不是一個嚴格的要求,但對於我們今天的目的來說,角落案例是模糊的。)

什麼類型的接收器具有該方法

它可以是C,接收器等於this?不,爲什麼不呢?因爲那麼我們如何跟蹤y和z的價值呢?對於M的每次調用可能有不同的值,因此接收者不能是this

編譯器做什麼是產生一個新的類:

class C 
{ 
    int x; 
    class Locals 
    { 
    public C __this; 
    public int y; 
    public int z; 
    public int A(int q) { return q + __this.x + y + z; } 
    } 

    void M(int y) 
    { 
    Locals locals = new Locals(); 
    locals.__this = this; 
    locals.y = y; 
    locals.z = GetZ(); 
    Func<int, int> f = locals.A; 
    ... 

那麼什麼是接收器?當地人的價值。什麼是方法? A.

當然,當地人和A都被給予了瘋狂的名字,所以你不能偶然打電話給他們。

在我使用匿名方法的情況下,有沒有辦法來提取真正的目標

您提取真正的接收器,我保證。

「M工作的一個延伸做一些事情與事件處理程序,我需要能夠辨別的事件處理程序的目標是

請不要做什麼。事件處理程序的接收者是提供處理程序的代碼的實現細節。它不適合你作出決定。編譯器完全有權在爲事件處理程序生成接收器時做出他們喜歡的任何選擇,而且他們也這樣做。例如,如果事件處理程序是在迭代器塊內創建的,或者是異步方法,請考慮會發生什麼情況。或者事件正在被一些反應擴展代碼訂閱,這些代碼正在對事件應用順序操作。同樣,編譯器將在整個地方生成類。你不能依賴班級是「明智的」。

你可以依賴的東西是:用戶希望在出現問題時調用給定的方法。這是你必須遵守的合同;不要試圖猜測訂閱者。

+0

好的,謝謝你幫助我變得不那麼無知。我應該指定 - 我想知道目標是什麼的原因('ISynchronizeInvoke'與'DispatcherObject')是因爲我希望能夠正常處理跨線程tomfoolery而不會爆炸(所以能夠調用'ISynchronizeInvoke.InvokeRequred '和'ISynchronizeInvoke.Invoke(...)'以及'DispatcherObject.Dispatcher.CheckAccess()'和'DispatcherObject.Dispatcher.Invoke(...)'相對不受懲罰會幫助我。 – Will

+0

@ will:如果觀察者和觀察者彼此擁有的契約是觀察者將在一個線程上下文中產生一個事件,而不是觀察者將觀察者給予觀察者的那個事件,那麼這兩個類的作者需要將它們聚集在一起並在它們之間進行排序。如果處理程序在與提供處理程序的環境不同的上下文中回調,那將是令人驚訝的。 –

相關問題