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

时间:2012-09-18 11:20:42

标签: c# .net events

在.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)); }
    }

2 个答案:

答案 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;
}

<强>更新
此代码使用比您的代码更复杂的适配器模式版本。 SomeClassAdapterSomeClass的适配器(其私有字段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));
    }
}