2011-08-10 38 views
1

我已經實現了自己的客戶端 - 服務器UI框架的事件註冊,就像在ASP.NET中一樣。我在字典中存儲的事件的名稱(如「Click」),併爲價值記得使用反射調用匿名事件處理程序?

oEventHandler.Method.DeclaringType.AssemblyQualifiedName.ToString() + "." + oEventHandler.Method.Name.

然後重新調用的事件處理程序後,我重新委託:

var oEventHandler = Delegate.CreateDelegate(typeof(BLUIEventHandler), oPage, sEventMethod, false) 

並調用它的網頁上:

oEventHandler.Invoke(oPage, this, oEventArgs); 

這工作正常事件處理程序,它ASPX頁面的一部分,就像

var oTheButton = new UIButton(); 
oTheButton.Click += this.HandleClick; 
private void HandleClick() {} 

,但無法爲匿名委託:

var oTheButton = new UIButton(); 
oTheButton.Click += delegate {/* Will never be called. */}; 

對於非匿名委託結果字符串是:

"MyTest.Rene.UI.Foo, BDRS, Version=8.10.1.19703, Culture=neutral, PublicKeyToken=null.HandleClick" 

對於匿名委託,它是:

"MyTest.Rene.UI.Foo+<>c__DisplayClass1, MyTest, Version=8.10.1.17866, Culture=neutral, PublicKeyToken=null.<OnInitializeLayout>oTheButton__0" 

但是,當我嘗試重新創建匿名委託,我得到一個綁定錯誤。 有沒有辦法回到匿名委託並調用它?

回答

3

這是永遠不會爲匿名方法的一般情況下工作,因爲有一個很好的機會,有捕獲的變量參與,你不會知道要捕獲的值(加上你已經改變了性質:原始關閉可能會更新捕獲的變量 - 它們不是獨立的副本)。

就我個人而言,我認爲你應該存儲Delegate實例 - 而不是名稱。 EventHandlerList是實現此操作的典型方法(以及每個事件的唯一object鍵)。

+0

但是Delegate實例是可序列化的嗎?如果事件處理程序位於ASPX頁面上,則頁面在渲染完成後將被卸載。所以我不能存儲一個引用,它會消失。 EventHandlerList如何處理? – Krumelur

+1

@Krumelur它不,因爲如此。就我個人而言,我不會在這裏查看序列化*。請求是孤立的;像這樣對待它。 –

+0

這就是我想要做的。因此,字符串表示。這也是ASP.NET如何做到的。如果它支持匿名代理,我必須嘗試。 – Krumelur

相關問題