我不能扩展(子类)DataReceivedEventArgs

本文关键字:DataReceivedEventArgs 子类 不能 扩展 | 更新日期: 2023-09-27 18:11:29

我正在尝试扩展DataReceivedEventArgs,以便我可以将额外的数据传递给正在扩展Process的类。当连接到进程时,不仅仅是从进程获取数据。OutputDataReceived,我想传入一个控件,让它写入。

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

The type 'System.Diagnostics.DataReceivedEventArgs' has no constructors defined
public class DataReceivedArgsWithControl : DataReceivedEventArgs
{
    public Control ControlAdded { get; set; }
}

如何添加另一个属性到这个Args?我已经扩展了EventArgs本身,因为它有一个构造函数,但不确定如何扩展这个Args

我不能扩展(子类)DataReceivedEventArgs

我怀疑你不能,因为构造函数是Internal。也许更好的方法是将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;
   }
}

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

相关文章:
  • 没有找到相关文章