Передавать дополнительные параметры или объекты с помощью обработчика событий

0 5StringRyan [2011-10-13 18:49:00]

Я чувствую, что это действительно просто, но у меня проблемы с этой проблемой. Я использую объект 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", но не знаю, как это поможет, или как даже изменить подпись "DoSomething", чтобы принять параметр DataReceivedArgsExtended, поскольку DataReceivedEventHandler ожидает метод с DataReceivedArgs

c# event-handling delegates eventargs


2 ответа


4 Решение ADIMO [2011-10-13 19:10:00]

Да, вы можете расширить 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 );
 }

0 Bonnev [2014-11-16 15:28:00]

На ваш вопрос уже ответили следующие вопросы:

С# передача дополнительных параметров обработчику событий?

Как передать дополнительную локальную переменную объекта в обработчик событий? [дубликат]

В вашем случае вам нужно использовать 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
}