取消订阅具有Reflection的事件中的另一个类

时间:2015-03-20 16:57:10

标签: .net reflection xamarin.forms

我正在使用一个非常紧密但不能满足我需要的第三方库(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); 
        }

编译时错误是    表达式表示变量&#39;其中a&#39; type&#39;或者&#39;方法组&#39;是预期的。

我的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,以免听取事件?

1 个答案:

答案 0 :(得分: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;