Я не могу расширить (подкласс) DataReceivedEventArgs? - PullRequest
2 голосов
/ 14 октября 2011

Я пытаюсь расширить DataReceivedEventArgs, чтобы я мог передать дополнительные данные классу, который расширяет Process. Вместо того чтобы просто получать данные из процесса при подключении к Process.OutputDataReceived, я хотел бы передать элемент управления для записи в него.

При попытке расширить DataReceivedEventArgs я получаю ошибки:

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

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

Как я могу добавить другое свойство к этому Args? Я сам расширил EventArgs, потому что у него есть конструктор, но не уверен, как расширить этот Args.

1 Ответ

2 голосов
/ 14 октября 2011

Я подозреваю, что вы не можете, потому что конструктор - 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 где-либо.

update-

Если вы не можете изменить подпись используемого вами делегата с 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;
   }
}

Идеальным вариантом было бы переопределить тип делегата в соответствии с вашей оболочкой, но вышеуказанный подход будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...