Передавать дополнительные параметры или объекты с помощью обработчика событий
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
}