2011-10-14 49 views
2

我想擴展DataReceivedEventArgs,以便我可以將其他數據傳遞給正在擴展Process的類。當連接到Process.OutputDataReceived時,幾乎不僅僅是從一個進程獲取數據,我想傳入一個控制來寫入。我不能擴展(子類)DataReceivedEventArgs?

當試圖延長DataReceivedEventArgs我得到的錯誤:

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

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

我怎樣才能添加其他屬性,以這個參數數量?我擴展了EventArgs本身,因爲它有一個構造函數,但不知道如何擴展這個Args。

+0

只需製作您自己的活動和EventArgs類,無需派生。 –

+0

我需要一個'DataReceivedEventArgs'提供的屬性:'public string Data {get; }' – 5StringRyan

+0

是的,這就是您在舉辦自己的活動時爲自己的EventArgs類所需的東西。像史蒂夫一樣。 –

回答

2

我懷疑你不能,因爲構造函數是Internal。也許更好的方法是將​​包裝在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; 
    } 
    } 
} 

當然,如果您需要多態性​​,這可能不適合。如果您有一個預期爲​​的事件處理程序,那麼它將不能與包裝類一起使用。例如:

public void MyHandler(object sender, DataReceivedEventArgs e) { ... } 

這隻能收到一個​​實例或派生類型,你的包裝不是一個實例。所以這取決於你是否需要處理你的自定義EventArgs類,如果它是任何地方的​​。

最新情況:

如果你不能改變你從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; 
    } 
} 

理想的選擇是重新定義委託類型以匹配包裝器,但上述方法將工作。

+0

你能解釋一下你最後一句話嗎?我不確定我是否理解使用這種類型的包裝可能會遇到什麼問題。 – 5StringRyan

+0

感謝您的更新,我認爲這將是一個問題。 process.OutputDataReceived事件期待DataReceivedEventHandler,它期待DataReceivedEventArgs:'public delegate void DataReceivedEventHandler(object sender,DataReceivedEventArgs e)'。看起來像我將不得不尋找另一種方式來獲得這種類型的功能 – 5StringRyan

+0

不一定。如果你不能重新定義委託,那麼你可以利用在這種情況下不理想的代理協方差,但會起作用。我會更新答案。 –