2011-01-25 53 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; 
    } 
}