【问题标题】:Pass additional parameters or objects using an Event Handler [duplicate]使用事件处理程序传递其他参数或对象[重复]
【发布时间】:2011-12-07 02:17:46
【问题描述】:

我觉得这真的很基本,但我遇到了这个问题。我正在使用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 的方法

【问题讨论】:

  • 您需要传递什么类型的附加信息? DataReceivedArgs 仅具有包含输出流的 Data 属性。
  • 是的,但是我想将此输出写入位于标签页上的 winforms Richtextbox。我想通过标签页。我想创建多个进程运行,并且想传入TabPage,这样输出就只会输出到这里。现在我在“DoSomething”方法中有一个硬编码的“RichTextBox”。

标签: c# delegates event-handling eventargs


【解决方案1】:

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

【讨论】:

  • 如果创建了一个新的事件参数(例如在我的情况下 DataReceivedArgsExtended),我是否必须将 Process 类扩展到我们这个参数?
  • 是的,因为只有您的 Process 类知道要传递给事件的 args 信息。
【解决方案2】:

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

C# passing extra parameters to an event handler?

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

在您的情况下,您需要在同一范围内使用anonymous delegate functionlambda 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2012-08-30
    相关资源
    最近更新 更多