如何解决EventHandler 向上转换/向下转换
我有一个定义 ConfigurationChanged
事件的库。它曾经使用EventArgs
,但我想将其扩展为MyEventArgs
,但不想给客户带来BC中断。他们仍然可以拥有 EventArgs
签名来使用事件参数。
只要他们直接分配处理方法,它就可以正常工作。但是如果他们中的一些人通过 EventHandler<EventArgs>
,那么它不会分配
Cannot implicitly convert type 'System.EventHandler<System.EventArgs>' to 'System.EventHandler<MyEventArgs>'
。
public class Test
{
private static event EventHandler<MyEventArgs> ConfigurationChanged;
public Test(EventHandler<EventArgs> eventHandler)
{
ConfigurationChanged += eventHandler; // Cannot implicitly convert
ConfigurationChanged += OnConfigurationChanged; // Works
}
private static void OnConfigurationChanged(object sender,EventArgs e)
{
}
}
public class MyEventArgs : EventArgs
{
}
您是否有任何解决方法/最佳实践,或者没有办法遵守重大变更?
解决方法
无论您做什么,更改事件的类型都是一种二进制破坏性更改。您所描述的是试图使其不成为源破坏性更改。
您可以做的是添加更具体的事件作为单独的事件,并通过从传递给 EventHandler<MyEventArgs>
的处理程序创建一个新的 add
来代理事件订阅/remove
部分。幸运的是,委托平等在这种情况下仍然有效,因此取消订阅会自动执行正确的操作:
using System;
public class MyEventArgs : EventArgs
{
}
public class Test
{
public event EventHandler<EventArgs> GeneralEvent
{
add => SpecificEvent += new EventHandler<MyEventArgs>(value);
remove => SpecificEvent -= new EventHandler<MyEventArgs>(value);
}
public event EventHandler<MyEventArgs> SpecificEvent;
private void OnEvent(MyEventArgs args)
{
SpecificEvent?.Invoke(this,args);
}
public static void Main()
{
var test = new Test();
EventHandler<EventArgs> generalHandler = (sender,args) => Console.WriteLine("General");
EventHandler<MyEventArgs> specificHandler = (sender,args) => Console.WriteLine("Specific");
test.GeneralEvent += generalHandler;
test.SpecificEvent += specificHandler;
Console.WriteLine("Raising event with both subscribed");
test.OnEvent(new MyEventArgs());
test.GeneralEvent -= generalHandler;
test.SpecificEvent -= specificHandler;
Console.WriteLine("Raising event with both unsubscribed");
test.OnEvent(new MyEventArgs());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。