2012-12-27 32 views
4

我正在構建一個協議處理程序。該協議可能支持一組未知的請求類型,並且我將有一個實現每個請求類型的類。這些請求處理程序類將擴展一個基本處理程序類。我試圖構建系統,以便支持新的請求類型,我所需要做的就是爲其添加一個類並重新編譯/部署/重新啓動服務。如何使用反射和抽象對象來動態加載類?

所以我有這樣的事情:

foreach (Type classType in protocolAssembly.GetTypes()) 
{ 
    if (classType.BaseType == typeof(ProtocolRequestHandler)) 
    { 
     if (supportedRequestsMap.Contains(classType.Method)) 
     { 
      // error: that method is already implemented! 
     } 

     supportedRequestsMap.Add(classType.Method, typeof(classType)); 
    } 
} 

添加一個新的類拿起服務重新啓動時,只要處理請求方法聲明。

我怎麼可以在編譯時通過強制執行通過基類ProtocolRequestHandler,物業方法將實施?我不想將方法類型用作「Null」或「Unknown」,或者拋出異常,並且我不想在擴展類的名稱中固有地指定支持的協議請求類型(我想調用無論我喜歡什麼類)。

有沒有辦法強制一個屬性的值設置在繼承類中?

有沒有更清潔的方式我可以做這種動態加載?我應該使用屬性來確定繼承類的受支持的方法嗎?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

你應該依靠接口作爲你的插件應該實現什麼方法的契約。
A(有點老,但仍然非常相關的)很好的教程能夠在here

+0

謝謝,出於某種原因,我認爲屬性不適用於接口。一旦我知道要尋找什麼,我發現明確的指導[這裏](http://msdn.microsoft.com/en-us/library/64syzecx(v=vs80).aspx)。 – flacnut

0

如果您使用的是基類,你爲什麼不只是創建所需的方法是一個抽象方法(或虛擬的,並指定找到如果可能的話,默認實現)。這將確保該方法存在於繼承的類中。我相信如果你正在思考和編寫自己的協議處理程序,你可能已經知道這一點,但我不確定是否有更好的方法來獲得你想要的。

+0

是的,我希望避免這種情況,只是因爲在每個類中實現一個返回固定字符串的方法似乎是樣板。即使通過界面使用屬性也不是那麼好。如果我可以使用屬性,並且在編譯時強制存在某些屬性(我可能會爲了感興趣而去調查它),那將會很好。 – flacnut

+0

我很想看看你想出的屬性路線,如果你發現一個不錯的模式,請編輯帖子。 – cchamberlain