7

.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)); }
    }
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のアダプターですSomeClassSomeClassプライベートフィールドにインスタンスがありますobj)。

クライアント コードはmy に 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 に答える