gpt4 book ai didi

c# - 如何在连接事件时转换 EventArgs?

转载 作者:太空狗 更新时间:2023-10-29 21:45:52 25 4
gpt4 key购买 nike

在 .NET 应用程序中,事件通常以这种方式连接:

    public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += value; }
remove { _dependency.OnChange -= value; }
}

然而,这仅在连接的事件具有相同的事件处理程序时才有效。在我目前的情况下,原始事件参数是库的专有,我不想将其暴露给客户端代码。所以我有某种适配器 (ChangeEventArgs)。如何使用上面的代码转换事件参数?我想象像下面这样的东西(但下面的代码不起作用)

    public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += Convert(value); }
remove { _dependency.OnChange -= Convert(value); }
}

    public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += value(this, Convert(args)); }
remove { _dependency.OnChange -= value(this, Convert(args)); }
}

最佳答案

试试这个:

public class SomeClassAdapter
{
private readonly SomeClass obj;

public SomeClassAdapter(SomeClass obj)
{
this.obj = obj;
this.obj.SomeEvent += HandleSomeClassSomeEvent;
}

private void HandleSomeClassSomeEvent(object sender, SomeEventArgs args)
{
OnSomeEvent(ConvertEventArgs(args));
}

private MyEventArgs ConvertEventArgs(SomeEventArgs args)
{
// the magic goes here...
}

protected virtual void OnSomeEvent(MyEventArgs args)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, args);
}
}

public event EventHandler<MyEventArgs> SomeEvent;
}

更新。
此代码使用比您的代码更复杂的适配器模式版本。 SomeClassAdapterSomeClass 的适配器(它在其私有(private)字段 obj 中有 SomeClass 实例)。

客户端代码订阅my SomeClassAdapter.SomeEvent。反过来,我的代码订阅了 SomeClass.SomeEvent。当 SomeClass.SomeEvent 被触发时,我的事件处理程序 (HandleSomeClassSomeEvent) 被调用。此事件处理程序将 SomeEventArgs 转换为 MyEventArgs 并引发 SomeClassAdapter.SomeEvent

所以,我们有链:SomeClass.SomeEvent -> HandleSomeClassSomeEvent -> SomeClassAdapter.SomeEvent。看起来像“事件代理”。

关于c# - 如何在连接事件时转换 EventArgs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12475998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com