Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我无法扩展(子类)DataReceivedEventArgs?_C#_Events_Controls - Fatal编程技术网

C# 我无法扩展(子类)DataReceivedEventArgs?

C# 我无法扩展(子类)DataReceivedEventArgs?,c#,events,controls,C#,Events,Controls,我正在尝试扩展DataReceivedEventArgs,以便可以将其他数据传递给正在扩展进程的类。在连接到process.OutputDataReceived时,我希望传入一个控件,以便它写入,而不仅仅是从进程获取数据 尝试扩展DataReceivedEventArgs时,我收到错误: The type 'System.Diagnostics.DataReceivedEventArgs' has no constructors defined public class DataReceive

我正在尝试扩展DataReceivedEventArgs,以便可以将其他数据传递给正在扩展进程的类。在连接到process.OutputDataReceived时,我希望传入一个控件,以便它写入,而不仅仅是从进程获取数据

尝试扩展DataReceivedEventArgs时,我收到错误:

The type 'System.Diagnostics.DataReceivedEventArgs' has no constructors defined

public class DataReceivedArgsWithControl : DataReceivedEventArgs
{
    public Control ControlAdded { get; set; }
}

如何将其他属性添加到此Args?我扩展了EventArgs本身,因为它有一个构造函数,但不确定如何扩展这个参数。

我怀疑您不能扩展,因为构造函数是
内部的。也许更好的方法是将
DataReceivedEventArgs
包装在
EventArgs
派生类中

class MyDataReceivedEventArgs : EventArgs
{
   DataReceivedEventArgs _inner;

   public MyDataReceivedEventArgs(DataReceivedEventArgs inner, object extraProperty)
   {
      _inner = inner;
      ExtraProperty = extraProperty;
   }

   public object ExtraProperty { get; private set;}
   public DataReceivedEventArgs DataArgs  
   { 
     get
     {
        return _inner;
     }
   }
}
当然,如果您需要使用
DataReceivedEventArgs
的多态性,这可能不合适。如果您的事件处理程序需要一个
DataReceivedEventArgs
,那么它将无法与包装器类一起工作。例如:

public void MyHandler(object sender, DataReceivedEventArgs e) { ... }
这只能接收一个
DataReceivedEventArgs
实例或派生类型的实例,而您的包装器不是。因此,这取决于您是否需要将自定义EventArgs类视为一个
DataReceivedEventArgs
任意位置

更新-

如果无法从
public delegate void DataReceivedEventHandler(object sender,DataReceivedEventArgs e)
更改正在使用的代理的签名,则仍可使用签名为
void MyEventHandler(object sender,EventArgs e)的方法进行订阅
由于代理参数的差异,然后检查
EventArgs
参数的实际类型

public void MyEventHandler(object sender, EventArgs e)
{
   var dataEventArgs = e as MyDataReceivedEventArgs;

   if(dataEventArgs != null
   {
      var extendedProperty = dataEventArgs.ExtraProperty;
      var innerArgs = dataEventArgs.DataArgs;
   }
}

理想的选择是重新定义委托类型以匹配包装器,但上述方法将起作用。

只需创建自己的event和EventArgs类,无需派生。我需要在
DataReceivedEventArgs
中提供的属性:
公共字符串数据{get;}
是,这就是当您提出自己的事件时,您自己的EventArgs类所需要的。就像史蒂夫一样。你能用最后一句话再解释一下吗?我不知道我在哪里会遇到麻烦使用这种类型的包装。感谢更新,我认为这将是一个问题。process.OutputDataReceived事件需要DataReceivedEventHandler,它需要DataReceivedEventArgs:
公共委托void DataReceivedEventHandler(对象发送方,DataReceivedEventArgs e)
。看起来我必须找到另一种方法来获得这种功能不一定。如果无法重新定义代理,则可以利用代理协方差,这种协方差在本例中并不理想,但会起作用。我将更新答案。我已完成以下操作并出现错误:
process.OutputDataReceived+=new MyEventHandler(TestMethod)
。TestMethod的签名是:
MyEventHandler(对象发送者,EventArgs e)
。错误状态为:
无法将类型project.MyEventHandler转换为System.Diagnostics.DataReceivedEventHandler
。我忘了什么吗?试着改为
process.OutputDataReceived+=TestMethod
或process.OutputDataReceived+=newDataReceiveDevenHandler(TestMethod)`