none
Как получить список ссылок на метод RRS feed

Ответы

  • Ну и отписывайте. Просто вам самому надо следить что вы где подписали, и потом отписывать. В конструкторе или методе класса подписываетесь на некоторое событие? В деструкторе отпишитесь. Или в другом методе, который вызывается когда подписка больше не нужна. И то, всем этим необходимо заниматься, только если подписка становится не нужна. Если ее наличие вам не мешает, то и не волнуйтесь, сборщик мусора, когда надо, сам все эти связки почистит.
    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:12
    16 декабря 2013 г. 8:37
    Отвечающий
  • Добрый день.

    Стандартными средствами - никак.


    А почему? Ведь событие - это делегат. У любого делегата метод GetInvocationList возвращает массив зарегистрированных обработчиков.
    16 декабря 2013 г. 13:39
  • Автор вопроса нечего не забыл! У меня есть несколько панелей с элементами управления, лежащих одна на другой, одна из которых отображается, а остолные "прячутся". Элементы управления видиомой панели привязаны к BindingSource, и для них обрабатываются события Format и Parse. Когда панель прячится их надо "отвязать", а котогда отображается "привязать" к обработчикам событий. Я это сделал вот так:

        Private Sub AddBindings(ctrl As Control, dataSource As Object, dataMamber As String)
            Dim _b As Binding
    
            ' Creates the binding
            _b = New Binding("Text", dataSource, dataMamber, True, DataSourceUpdateMode.OnValidation, String.Empty)
            ' Add the delegates to the event
            AddHandler _b.Format, AddressOf General.NullableNumberToString
            AddHandler _b.Parse, AddressOf General.StringToNullableNumber
            ctrl.DataBindings.Add(_b)
        End Sub
    
        Private Sub RemoveBindings(ctrl As Control)
            Dim _CtrBindings As ControlBindingsCollection
            Dim _b As Binding
    
            _CtrBindings = ctrl.DataBindings
    
            ' Get the Binding for the Text property.
            _b = _CtrBindings("Text")
            RemoveHandler _b.Format, AddressOf General.NullableNumberToString
            RemoveHandler _b.Parse, AddressOf General.StringToNullableNumber
    
            ctrl.DataBindings.Remove(_b)
        End Sub

    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:12
    17 декабря 2013 г. 7:29
  • Список получить можно, отписать нельзя... Раз вы нашли решение, то не забудьте отметить сообщение или сообщения, которые помогли вам в решении проблемы. Для этого под каждым сообщением есть кнопка "Пометить как ответ".
    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:11
    17 декабря 2013 г. 7:50
    Отвечающий

Все ответы

  • Добрый день.

    Стандартными средствами - никак.

    16 декабря 2013 г. 8:12
    Отвечающий
  • А как же тогда поступать, если вначале нужно "привязать" обработчики события, а потом требуется их "отвязвть"?
    16 декабря 2013 г. 8:33
  • Ну и отписывайте. Просто вам самому надо следить что вы где подписали, и потом отписывать. В конструкторе или методе класса подписываетесь на некоторое событие? В деструкторе отпишитесь. Или в другом методе, который вызывается когда подписка больше не нужна. И то, всем этим необходимо заниматься, только если подписка становится не нужна. Если ее наличие вам не мешает, то и не волнуйтесь, сборщик мусора, когда надо, сам все эти связки почистит.
    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:12
    16 декабря 2013 г. 8:37
    Отвечающий
  • Добрый день.

    Стандартными средствами - никак.


    А почему? Ведь событие - это делегат. У любого делегата метод GetInvocationList возвращает массив зарегистрированных обработчиков.
    16 декабря 2013 г. 13:39
  • Да, есть этот метод, и даже внутри класса в котором объявлено событие вы им можете воспользоваться. Но вот за пределами класса вступает одно из ограничений событий. А именно: делегат за пределами класса допускает только подписывание (+=) и отписывание (-=).
    16 декабря 2013 г. 14:32
    Отвечающий
  • "А именно: делегат за пределами класса допускает только подписывание (+=) и отписывание (-=)." - поддерживаю, именно в этом и весь основной смысл событий, не давать прямого доступа к объекту делегата.

    Сделаем содержимое сообщества лучше, вместе!

    16 декабря 2013 г. 14:55
    Модератор
  • Сложно, конечно, бывает понять логику задающего вопрос. Но подобная задача, скорее всего, и может возникнуть у владельца события :)
    16 декабря 2013 г. 16:59
  • Еще раз. У вас тот кто подписывается на событие, тот и должен следить за отписыванием от него. Класс не должен ничего знать о подписчиках. После выхода объекта из зоны видимости, событие перестанет вызываться по вполне понятным причинам, и сборщик мусора все нормально почистит сам. При помощи метода GetInvocationList, вы конечно внутри класса можете получить список методов подписанных на событие, вы даже можете вызвать их по схеме:

    var subscriber = p.B.GetInvocationList().First();
    subscriber.DynamicInvoke(10);
    Но принимать решение об отписывании этих методов, класс содержащий событие не может.

    17 декабря 2013 г. 3:33
    Отвечающий
  • Но принимать решение об отписывании этих методов, класс содержащий событие не может.

    Может, но не должен. Речь здесь не идет о правильном или неправильном проектировании обработки событий. Повторю, я не знаю, что хочет делать со списком обработчиков задающий этот вопрос. Я лишь отвечаю на него. Вероятно, Вас сбила его реплика об "отвязывании". Однако, первоначальный вопрос состоял в технической возможности получения списка. Вы сказали, что ее нет, а я говорю, что она есть. Вот и все.

    А вообще, мне кажется, что мы зря "ломаем копья". Автор поста уже забыл о нем. Ему важно было только задать вопрос :)

    17 декабря 2013 г. 5:46
  • А вообще, мне кажется, что мы зря "ломаем копья". Автор поста уже забыл о нем. Ему важно было только задать вопрос :)


    Не знаю как вам со мной, а мне с вами приятно пообщаться в отсутствии топиккастера. Но согласен, что то я не внимательно вопрос читал ;)
    17 декабря 2013 г. 6:12
    Отвечающий
  • Автор вопроса нечего не забыл! У меня есть несколько панелей с элементами управления, лежащих одна на другой, одна из которых отображается, а остолные "прячутся". Элементы управления видиомой панели привязаны к BindingSource, и для них обрабатываются события Format и Parse. Когда панель прячится их надо "отвязать", а котогда отображается "привязать" к обработчикам событий. Я это сделал вот так:

        Private Sub AddBindings(ctrl As Control, dataSource As Object, dataMamber As String)
            Dim _b As Binding
    
            ' Creates the binding
            _b = New Binding("Text", dataSource, dataMamber, True, DataSourceUpdateMode.OnValidation, String.Empty)
            ' Add the delegates to the event
            AddHandler _b.Format, AddressOf General.NullableNumberToString
            AddHandler _b.Parse, AddressOf General.StringToNullableNumber
            ctrl.DataBindings.Add(_b)
        End Sub
    
        Private Sub RemoveBindings(ctrl As Control)
            Dim _CtrBindings As ControlBindingsCollection
            Dim _b As Binding
    
            _CtrBindings = ctrl.DataBindings
    
            ' Get the Binding for the Text property.
            _b = _CtrBindings("Text")
            RemoveHandler _b.Format, AddressOf General.NullableNumberToString
            RemoveHandler _b.Parse, AddressOf General.StringToNullableNumber
    
            ctrl.DataBindings.Remove(_b)
        End Sub

    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:12
    17 декабря 2013 г. 7:29
  • Бинго, именно об этом я вам и говорил в своем втором ответе в этом топике. Подписали методы, по мере потери надобности не забудьте отписать. Получать для этого список всех подписанных методов необходимости нет.
    17 декабря 2013 г. 7:36
    Отвечающий
  • просто я думал так будет попроще, получить список и отписать всё в цикле, а так приходится вызывать для каждого элемента управления поотдельности.
    17 декабря 2013 г. 7:47
  • Список получить можно, отписать нельзя... Раз вы нашли решение, то не забудьте отметить сообщение или сообщения, которые помогли вам в решении проблемы. Для этого под каждым сообщением есть кнопка "Пометить как ответ".
    • Помечено в качестве ответа SergejS 17 декабря 2013 г. 9:11
    17 декабря 2013 г. 7:50
    Отвечающий