我正在使用一个非常紧密但不能满足我需要的第三方库(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,以免听取事件?
答案 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;