C# EventHandler向上/向下广播

C# EventHandler向上/向下广播,c#,casting,eventhandler,C#,Casting,Eventhandler,我有一个定义ConfigurationChanged事件的库。它以前使用EventArgs,但我想将其扩展到MyEventArgs,但不想给客户带来业务连续性中断。他们仍然可以使用EventArgs签名来使用事件args 只要他们直接指定处理方法,它就可以正常工作。但是,如果其中一些传递EventHandler,那么它将不会使用 无法将类型“System.EventHandler”隐式转换为“System.EventHandler” 公共类测试 { 私有静态事件事件处理程序配置已更改; 公共测

我有一个定义
ConfigurationChanged
事件的库。它以前使用
EventArgs
,但我想将其扩展到
MyEventArgs
,但不想给客户带来业务连续性中断。他们仍然可以使用
EventArgs
签名来使用事件args

只要他们直接指定处理方法,它就可以正常工作。但是,如果其中一些传递
EventHandler
,那么它将不会使用
无法将类型“System.EventHandler”隐式转换为“System.EventHandler”

公共类测试
{
私有静态事件事件处理程序配置已更改;
公共测试(EventHandler EventHandler)
{
ConfigurationChanged+=eventHandler;//无法隐式转换
ConfigurationChanged+=OnConfigurationChanged;//有效
}
私有静态void OnConfigurationChanged(对象发送方,事件参数e)
{
}
}
公共类MyEventArgs:EventArgs
{
}

您是否有任何解决方法/最佳实践,或者没有办法遵守中断更改?

无论您做什么,更改事件类型都是一种二进制中断更改。您所描述的是试图使其不是破坏源代码的更改

您可以做的是将更具体的事件作为单独的事件添加,并通过从传递到
添加
/
删除
部分的处理程序创建新的
事件处理程序
来代理事件订阅。幸运的是,委托平等在这种情况下仍然有效,因此取消订阅会自动执行正确的操作:

使用系统;
公共类MyEventArgs:EventArgs
{
}
公开课考试
{
公共事件事件处理程序GeneralEvent
{
add=>SpecificEvent+=new EventHandler(值);
remove=>SpecificEvent-=new EventHandler(值);
}
公共事件处理程序特定事件;
私有void OnEvent(MyEventArgs args)
{
SpecificEvent?.Invoke(此参数为args);
}
公共静态void Main()
{
var测试=新测试();
EventHandler generalHandler=(发送方,参数)=>Console.WriteLine(“常规”);
EventHandler specificHandler=(发送方,参数)=>Console.WriteLine(“特定”);
test.GeneralEvent+=generalHandler;
test.SpecificEvent+=specificHandler;
Console.WriteLine(“双方认购的募集事件”);
test.OnEvent(新的MyEventArgs());
test.GeneralEvent-=generalHandler;
test.SpecificEvent-=specificHandler;
Console.WriteLine(“双方均未订阅的提升事件”);
test.OnEvent(新的MyEventArgs());
}
}

这是一个不错的建议,我会在这里解决它,或者最终带来BC break。谢谢你,汉克斯,这是一个不错的方法,有一个旧事件的适配器。我会考虑我是否按照你们的建议进行过渡,并立即停止改变。
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
{
}