7

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

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

但是,这仅在被连接的事件具有相同的事件处理程序时才有效。在我目前的情况下,原始事件 args 是库专有的,我不想将其公开给客户端代码。所以我有某种适配器(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)); }
    }
4

2 回答 2

5

试试这个:

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) 被调用。此事件处理程序转换SomeEventArgsMyEventArgs并引发SomeClassAdapter.SomeEvent.

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

于 2012-09-18T11:37:01.503 回答
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));
    }
}
于 2012-09-18T12:22:59.440 回答