在.NET应用程序中,通常以这种方式连接事件:
public event EventHandler<ChangeEventArgs> OnChange
{
add { _dependency.OnChange += value; }
remove { _dependency.OnChange -= value; }
}
但是,只有当有线事件具有相同的事件处理程序时,这才有效。在我目前的情况下,原始事件args是库的专有,我不想将它暴露给客户端代码。所以我有一些适配器(ChangeEventArgs)。如何使用上面的代码转换事件args?我想象下面的东西(但下面的代码不起作用)
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)); }
}
答案 0 :(得分:4)
试试这个:
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;
}
<强>更新强>
此代码使用比您的代码更复杂的适配器模式版本。 SomeClassAdapter
是SomeClass
的适配器(其私有字段SomeClass
中有obj
个实例)。
客户端代码订阅我的 SomeClassAdapter.SomeEvent
。反过来,我的代码订阅了SomeClass.SomeEvent
。触发SomeClass.SomeEvent
时,将调用我的事件处理程序(HandleSomeClassSomeEvent
)。此事件处理程序会将SomeEventArgs
转换为MyEventArgs
并引发SomeClassAdapter.SomeEvent
。
所以,我们有链:SomeClass.SomeEvent
- &gt; HandleSomeClassSomeEvent
- &gt; SomeClassAdapter.SomeEvent
。看起来像“事件代理”。
答案 1 :(得分:0)
您需要在此处执行一些操作,我将假设您的Convert()
方法的返回类型将被称为SupportedChangeEventArgs
正常模式将是:
public event EventHandler<SupportedChangeEventArgs> Changed; // per http://msdn.microsoft.com/en-us/library/h0eyck3s%28v=vs.71%29.aspx
添加一个提升事件的虚拟成员
public virtual void OnChanged(ChangeEventArgs e)
{
if( Changed != null )
{
Changed(this, Convert(e));
}
}