2012-12-06 40 views
0

基類的一個子保護方法得到了下面的代碼你怎麼稱呼從動態

protected virtual void InternalChange(DomainEvent @event) 
{ 
     ((dynamic) this).Apply(@event); 
} 

子對象實現通過一些領域來處理事件的邏輯,例如

protected Apply (Message1 message) 
{ 

} 
protected Apply (Message2 message) 
{ 

} 

然而,這給出了一個錯誤,說它無法訪問。我試過虛擬但沒有運氣..

任何想法?希望沒有像這種方法反射。 (例如http://blogs.msdn.com/b/davidebb/archive/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code.aspx

更多信息我可以將InternalChange移動到子類,但是id沒有讓子進行調度。

​​

編輯現在我使用這個在孩子(和作出的抽象父)的作品,但它醜陋的ID,而實施者不用擔心調度。

protected void Handle(DomainEvent message) 
    { 
     Handle ((dynamic) message); 
    } 

回答

0

你應該定義你的基類有兩種方法簽名abstractvirtual,例如。

protected abstract void Apply(Message1 message); 

使用virtual如果要定義你的基類的實現,不必(但可以),在子類中重寫。

在你的子類,你會忽略它是這樣:

protected override void Apply(Message1 message) 
{ 
    // code here 
} 

而且,在你的榜樣,該方法InternalChange試圖調用ApplyDomainEvent類型的參數,但是,在這兩個你重載它們接受Message1Message2的任一種類型。如果它編譯完成,無論如何你都會得到運行時錯誤,因爲.NET動態運行時將無法找到與參數相匹配的適當方法。

至於使用動態,我認爲這是沒有必要的問題。

+0

Message1和Message2是DomainEvent類型,這是我需要的棘手部分運行時通過動態投射/重載...這也是爲什麼我不能將抽象方法放在基類中,因爲我不知道參數實現者將使用。 – user1496062

+0

如果'Message1'和'Message2'繼承自'DomainEvent',則不能上傳該方向。我建議你使用關鍵字'as'來確定發送到'InternalChange'的實際類型。 – Matthew

+0

但是代碼並不知道它來自事件源DB的具體類型......當然,我可以創建一個case語句或使用反射,但有沒有更好的方法? – user1496062

0

邏輯是有點......倒過來。我不明白一兩件事:哪些類正在調用apply,基類型還是子類型?如何識別兒童課程以發送活動?你不能渲染應用虛擬保護,並將它留在基類中爲空嗎?

相關問題