2

これは本当に基本的なことだと思いますが、この問題に問題があります。Processオブジェクトを使用していて、 DataReceivedEventHandler. 次に、このイベント ハンドラーは別のメソッド (この場合は "DoSomething") に委任します。引数の署名は (Object sender, DataReceivedEventArgs args) です。私がする必要があるのは、何かを拡張するか、追加情報を渡す何かを提供することです。これが私の現在のコードです:

// an object of some type
MyCustomObject obj = new MyCustomObject();

// set up obj and Process

process.OutputDataReceived += new DataReceivedEventHandler(DoSomething);

public void DoSomething(Object sender, DataReceivedArgs args)
{
    // do some stuff, however, I need the "obj" object passed in for work
}

これは本当に些細なことだと思いますが、どのように進めればよいかわかりません。「EventArgs」のサブクラス化について読んだことがありDataReceivedArgsExtendedますが、DataReceivedEventHandler は DataReceivedArgs を持つメソッドを期待しているため、それがどのように役立つか、または「DoSomething」の署名を変更してパラメーターを受け入れる方法さえわかりません

4

2 に答える 2

4

はい、DataReceivedArgs を DataReceivedArgsExtended に拡張できますが、イベント ハンドラー メソッドにキャストすることを忘れないでください。例えば:

public class MyObject
{
    public event EventHandler<MyEventArgs> OnFire;

    public void Fire()
    {
        if( OnFire != null )
        {
            //var e = new MyEventArgs { X=2 };

            var e = new MyEventArgsNew { X = 3, Y = 4 };

            OnFire( this, e );
        }
    }
}

public class MyEventArgs : EventArgs
{
    public int X { get; set; }
}

public class MyEventArgsNew : MyEventArgs
{
    public int Y { get; set; }
}

static void Main( string[] args )
{
        var obj = new MyObject();

        obj.OnFire += new EventHandler<MyEventArgs>( obj_OnFire );

        obj.Fire();

        Console.ReadLine();
 }

 static void obj_OnFire( object sender, MyEventArgs e )
 {
        var e2 = (MyEventArgsNew)e;

        Console.WriteLine( e2.X );
        Console.WriteLine( e2.Y );
 }
于 2011-10-13T16:10:39.320 に答える
0

あなたの質問は、次の質問ですでに回答されています。

C#は追加のパラメータをイベントハンドラに渡しますか?

追加のローカル オブジェクト変数をイベント ハンドラーに渡すにはどうすればよいですか? [複製]

あなたの場合、同じスコープでanonymous delegate functionまたはを使用し、lambda expressionその中からイベントハンドルパラメーターと追加のものを含む独自の関数を呼び出す必要があります。

// an object of some type
MyCustomObject obj = new MyCustomObject();

// set up obj and Process

process.OutputDataReceived +=
    (Object _sender, DataReceivedArgs _args) =>
        DoSomething(obj, _sender, _args);

public void DoSomething(Process process, Object sender, DataReceivedArgs args)
{
    // do some stuff
}
于 2014-11-16T12:28:28.990 に答える