2011-01-25 7 views
2

動的オブジェクトにイベントハンドラを追加しました。しかし、私はそれらを削除することはできません。それを取り外すとき DynamicObjectからのイベントの削除

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

私は、イベントハンドラを追加し

が、私はしかし、呼び出しは引数としてハンドラでTrySetMemberするために取得、値はnullです。それがnullの場合、その特定のイベントのハンドラの内部ストレージからどのハンドラを削除するかを知るはずです。

答えて

0

私はあなたの周りにあなたのnew EventHandlerへの参照を保持し、それを削除する必要があると思う。問題は見てスニペットなしであるかもしれないものを推測する

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

ナー、それは違いはありませんでした。値はまだnullです。 – fettsnoken

+0

ああ、申し訳ありません。私はそのパターンを生成されたコードに多く見ました。 WCFから。 – Rup

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; 
    } 
} 
+0

ああ、私はTryGetMemberのオーバーライドでイベントハンドラを取得しないという理由があります。意味あり。しかし、私のバックエンドは、obvervationのためにJavaスタイルのリスナーを使用する一連の信号です。 Typeオブジェクトの配列としてパラメータ型にアクセスできます。私はこれを解決するためにリフレクションを使用して私の各信号の代理人を作成する必要があると思います。 – fettsnoken

-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 

EventHandlerはそれだけであなたが左に何もないように、最後に設定したプロパティは、nullにする必要があります削除されているイベントハンドラを持っていたので、もしあなたが、コレクションのようにそれを考える必要がありますので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; 
    } 
} 
関連する問題