2015-03-20 4 views
0

Я работаю с сторонней библиотекой, которая очень плотно закрыта, но не делает то, что мне нужно (Xamarin.Forms, жесты панорамирования/увеличения).Отказаться от подписки другого класса от события с отражением

Я взломал рабочий процесс, но с их последним обновлением (1.4) работа перестала работать. Изучая их код, я могу исправить свою работу, если я могу отказаться от подписки на один из классов библиотеки от прослушивания события, проблема в том, что у класса есть несколько частных методов, в которых они должны быть защищены.

Вот мой код:

public class InteractiveEventTracker: EventTracker{ 
     public InteractiveEventTracker(IVisualElementRenderer renderer) 
      : base(renderer) 
     { 
      this.Renderer = renderer; 
      var elChgMethod = typeof(EventTracker).GetMethod("OnElementChanged", BindingFlags.NonPublic | BindingFlags.Instance); 
      var elChgDelegate = Delegate.CreateDelegate(typeof(EventHandler<VisualElementChangedEventArgs>), elChgMethod); 
// Compile-time errors, how do I spell that? 
      renderer.ElementChanged -= new EventHandler<VisualElementChangedEventArgs>(elChgDelegate); 
     } 

Ошибка времени компиляции является Выражение обозначает «переменную», где ожидается «тип» или «групповой метод».

Мои InteractiveEventTracker должен вызывать базовый конструктор, который выглядит следующим образом:

public EventTracker(IVisualElementRenderer renderer) 
    { 
     if (renderer == null) 
     { 
      throw new ArgumentNullException("renderer"); 
     } 
     this.renderer = renderer; 
     this.renderer.ElementChanged += new EventHandler<VisualElementChangedEventArgs>(this.OnElementChanged); // this is what I want to unsubscribe 
    } 
    private void OnElementChanged(object sender, VisualElementChangedEventArgs e){ 
... 
    } 

Как отказаться базовый класс, EventTracker от прослушивания события?

+0

так почему бы и нет 'this.renderer.ElementChanged - = new EventHandl э (this.OnElementChanged) '? вы можете изменить 'private' на' protected' и попробовать его – Grundy

+0

Это сторонняя библиотека, я не могу изменить сам EventTracker –

+0

на какой строке ошибка? когда вы отмените подписку? или создать делегат? – Grundy

ответ

0

У вас есть несколько ошибок в коде:

1) неправильно Создание метод делегата

Delegate.CreateDelegate(typeof(EventHandler<VisualElementChangedEventArgs>), elChgMethod); 

эта перегрузка

Создает делегат указанного типа для представления указанного статического метод.

поэтому вам нужно пройти также экземпляр, как

Delegate.CreateDelegate(typeof(EventHandler<VisualElementChangedEventArgs>), this, elChgMethod); 

2) вы должны явно отбрасываемой созданный делегат вам тип EventHandler, как

renderer.ElementChanged -= (EventHandler<VisualElementChangedEventArgs>)elChgDelegate; 

Так что вам нужно изменить ваш код, как это

var elChgMethod = typeof(EventTracker).GetMethod("OnElementChanged", BindingFlags.NonPublic | BindingFlags.Instance); 
var elChgDelegate = Delegate.CreateDelegate(typeof(EventHandler<VisualElementChangedEventArgs>), this, elChgMethod); 
renderer.ElementChanged -= (EventHandler<VisualElementChangedEventArgs>)elChgDelegate; 
Смежные вопросы