5

コンストラクターにクラスAがあります...Object_BのeventHandlerに無名関数を割り当てています。

クラスAのDisposeメソッドからそれを削除(購読解除)するにはどうすればよいですか?

どんな助けでもいただければ幸いです!ありがとう

Public Class A
{

public A()
 {

 B_Object.DataLoaded += (sender, e) =>
                {
                   Line 1
                   Line 2
                   Line 3
                   Line 4
                };
 }

Public override void Dispose()
{
  // How do I unsubscribe the above subscribed anonymous function ?
}
}
4

3 に答える 3

8

基本的にはできません。それをメソッドに移動するか、メンバー変数を使用して、後でデリゲートを保持します。

public class A : IDisposable
{
    private readonly EventHandler handler;

    public A()
    {
        handler = (sender, e) =>
        {
           Line 1
           Line 2
           Line 3
           Line 4
        };

        B_Object.DataLoaded += handler;
     }

     public override void Dispose()
     {
        B_Object.DataLoaded -= handler;
     }
}
于 2012-03-16T22:29:42.680 に答える
0

これを行う正しい方法は、Rx拡張機能を使用することです。こちらのビデオをご覧ください:

http://msdn.microsoft.com/en-us/data/gg577611

「ブルース」の映画は特に便利だと思いました。

于 2012-03-16T22:31:21.140 に答える
0

これは、ハンドラー変数を使用しない代替手段です。

Public Class A
{

 public A()
  {

    B_Object.DataLoaded += (sender, e) =>
                {
                   Line 1
                   Line 2
                   Line 3
                   Line 4
                };
  }

  Public override void Dispose()
  {
   if(B_Object.DataLoaded != null)
   {
     B_Object.DataLoaded -=
         (YourDelegateType)B_Object.DataLoaded.GetInvocationList().Last();
       //if you are not sure that the last method is yours than you can keep an index
       //which is set in your ctor ...
   }
  }
 }
于 2012-03-16T22:56:39.787 に答える