2011-01-25 35 views
2

我已成功將事件處理程序添加到我的動態對象。但是,我無法刪除它們。從DynamicObject刪除事件

dynamic d = new MyDynamicObject(); 
d.MyEvent += new EventHandler(this.MyHandler); 
d.MyEvent -= new EventHandler(this.MyHandler); 

當我添加事件處理程序,我接到一個電話到與處理器作爲參數TrySetMember,但在取出時的值爲null。如果它爲空,我應該怎麼知道哪個處理程序從我的內部存儲處理程序中刪除該特定事件?

回答

0

我認爲你需要一個參考存到自己new EventHandler各地,並刪除:

var MyEventHandler = new EventHandler(this.MyHandler); 
d.MyEvent += MyEventHandler; 
d.MyEvent -= MyEventHandler; 
+0

那麼,這沒有什麼區別。值仍然爲空。 – fettsnoken 2011-01-25 19:46:36

+0

哦,好的 - 對不起。我在生成的代碼中看到了很多模式,例如來自WCF。 – Rup 2011-01-26 09:44:54

1

很難猜測的問題可能是什麼沒有一個片段來看待。我只是張貼一些簡單的工作:

using System; 
using System.Dynamic; 

class Program { 
    static void Main(string[] args) { 
     dynamic obj = new MyDynamicObject(); 
     obj.MyEvent += new EventHandler(handler); 
     obj.MyEvent(null, EventArgs.Empty); 
     obj.MyEvent -= new EventHandler(handler); 
    } 
    static void handler(object sender, EventArgs e) { } 
} 

class MyDynamicObject : DynamicObject { 
    private EventHandler dlg = new EventHandler(delegate { }); 
    public override bool TryGetMember(GetMemberBinder binder, out object result) { 
     result = dlg; 
     return true; 
    } 
    public override bool TrySetMember(SetMemberBinder binder, object value) { 
     dlg = (EventHandler)value; 
     return true; 
    } 
} 
-1

你居然不知道要刪除什麼,因爲它並不像它具有添加靜態事件工作,如果DLR沒有看到一個刪除靜態事件屬性,當您執行+=-=時,它會動態執行以下等效操作。

//d.MyEvent += new EventHandler(this.MyHandler); 
var temp = d.MyEvent; //temp is null 
temp += new EventHandler(this.MyHandler) //temp is now MyHandler 
d.MyEvent = temp; //set it back 

//d.MyEvent -= new EventHandler(this.MyHandler); 
var temp = d.MyEvent; //temp is MyHandler 
temp -= new EventHandler(this.MyHandler) //temp is now null 
d.MyEvent = temp; //set it back 

事件處理程序是一個MulticastDelegate所以你應該把它想的集合,因此,如果它只有要刪除,在最後一組屬性應該是零,因爲沒有什麼留下的事件處理程序。如果你在混音中添加了更多的事件,它會更清晰。

//d.MyEvent += new EventHandler(this.MyHandler); 
var temp = d.MyEvent; //temp is null 
temp += new EventHandler(this.MyHandler) //temp is now MyHandler 
d.MyEvent = temp; //set it back 

//d.MyEvent += new EventHandler(this.MyHandler2); 
var temp = d.MyEvent; //temp is MyHandler 
temp += new EventHandler(this.MyHandler2) //temp is now MyHandler,MyHandler2 
d.MyEvent = temp; //set it back 

//d.MyEvent -= new EventHandler(this.MyHandler); 
var temp = d.MyEvent; //temp is MyHandler,MyHandler2 
temp -= new EventHandler(this.MyHandler) //temp is now MyHandler2 
d.MyEvent = temp; //set it back 

如果你有來存儲不同的看法和需要的添加和刪除然後進行存儲類來包裝自己的行爲負責,並確保您返回它在你的TryGet。

public DelegateStoreage<T>{ 

public void Add(T del){ 
    //Do your stuff 
} 
public void Remove(T del){ 
    //Do your stuff 
} 
public static T operator +(DelegateStoreage<T> x, T y) 
    { 
     x.Add(y) 
     return x 
    } 

    public static T operator -(DelegateStoreage<T> x, T y) 
    { 
     x.Remove(y) 
     return y; 
    } 
}