Как отписаться от анонимной функции в методе Dispose класса? - PullRequest
5 голосов
/ 17 марта 2012

У меня есть класс A ... в его конструкторе ... Я назначаю анонимную функцию для eventHandler Object_B.

Как удалить (отписаться) это из метода Dispose класса A?

Любая помощь будет оценена!Спасибо

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 ?
}
}

Ответы [ 3 ]

7 голосов
/ 17 марта 2012

Вы не можете, в основном. Либо переместите его в метод, либо используйте переменную-член, чтобы оставить делегат на потом:

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;
     }
}
0 голосов
/ 17 марта 2012

Это альтернатива без использования переменной-обработчика.

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 ...
   }
  }
 }
0 голосов
/ 17 марта 2012

Правильный способ сделать это - использовать расширения Rx.Посмотрите видео здесь:

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

Мне показался фильм "Блюз" особенно полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...