使用事件处理程序传递附加参数或对象

发布于 2024-12-09 16:49:53 字数 757 浏览 8 评论 0原文

我觉得这确实很基本,但我在这个问题上遇到了麻烦。我正在使用 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

I feel like this is really basic, but I'm having trouble with this issue. I'm using a Process object and subscribing to a DataReceivedEventHandler. This event handler then delegates to another method, in this case "DoSomething", and the signature for the arguments is (Object sender, DataReceivedEventArgs args). What I need to do, is extend something, or provide something that will pass in additional information. Here is my current code:

// 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
}

I feel like this is really trivial, but not sure how to proceed. I've read about subclassing the "EventArgs," but not sure how that will help, or how to even change the signature of "DoSomething" to accept a DataReceivedArgsExtended parameter, since the DataReceivedEventHandler is expecting a method with a DataReceivedArgs

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

楠木可依 2024-12-16 16:49:53

是的,您可以将 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 );
 }

Yes you can extend your DataReceivedArgs to DataReceivedArgsExtended, but remeber cast it into event handler method. For example:

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 );
 }
忘你却要生生世世 2024-12-16 16:49:53

您的问题已在以下问题中得到解答:

C# 传递额外参数到事件处理程序?

如何将附加本地对象变量传递给我的事件处理程序? [重复]

在您的情况下,您需要在同一范围内使用匿名委托函数lambda表达式,并从其中调用您自己的函数,包含事件处理参数和您的附加参数:

// 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
}

Your question is already answered in the following questions:

C# passing extra parameters to an event handler?

How can I pass addition local object variable to my event handler? [duplicate]

In your case you need to use an anonymous delegate function or a lambda expression in the same scope and from within it call your own function, containing the event handle parameters and your additional ones:

// 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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文