在.NET应用程序中,通常以这种方式连接事件:
public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += value; }
remove { _dependency.OnChange -= value; }
}
Run Code Online (Sandbox Code Playgroud)
但是,这仅在有线事件具有相同事件处理程序时才有效.在我目前的情况下,原始事件args是库的专有,我不想将它暴露给客户端代码.所以我有一些适配器(ChangeEventArgs).如何使用上面的代码转换事件args?我想象下面的东西(但下面的代码不起作用)
public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += Convert(value); }
remove { _dependency.OnChange -= Convert(value); }
}
Run Code Online (Sandbox Code Playgroud)
要么
public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += value(this, Convert(args)); }
remove { _dependency.OnChange -= value(this, Convert(args)); }
}
Run Code Online (Sandbox Code Playgroud)
尝试这个:
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;
}
Run Code Online (Sandbox Code Playgroud)
更新。
与您的代码相比,此代码使用了更复杂的适配器模式版本。SomeClassAdapter是一个适配器SomeClass(它SomeClass在其私有字段中有实例obj)。
Client code subscribes to my SomeClassAdapter.SomeEvent. My code, in turn, subscribes to SomeClass.SomeEvent. When SomeClass.SomeEvent is fired, my event handler (HandleSomeClassSomeEvent) is called. This event handler converts SomeEventArgs to MyEventArgs and raises SomeClassAdapter.SomeEvent.
So, we have the chain: SomeClass.SomeEvent -> HandleSomeClassSomeEvent -> SomeClassAdapter.SomeEvent. Looks like "event proxy".