簡體   English   中英

如何使用反射和抽象對象動態加載類?

[英]How to use reflection and abstract objects to dynamically load classes?

我正在構建一個協議處理程序。 該協議可能支持一組未知的請求類型,我將有一個實現每種請求類型的類。 這些請求處理程序類將擴展基本處理程序類。 我正在嘗試構建系統,以便為了支持新的請求類型,我需要做的就是為此添加一個類並重新編譯/部署/重新啟動服務。

所以我有這樣的事情:

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在編譯時強制執行屬性Method 我不想使用方法類型為“Null”或“Unknown”,或拋出異常,我不想在擴展類的名稱中固有地指定支持的協議請求類型(我想調用我喜歡的課程。

有什么方法可以強制一個屬性在繼承類中設置其值?

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

您應該依賴接口作為插件應該實現的方法的契約。
這里可以找到一個(有點舊,但仍然非常相關)很好的教程

如果您使用的是基類,為什么不將所需的方法創建為抽象方法(如果可能,則為虛擬並指定默認實現)。 這將確保您的繼承類中存在該方法。 我相信如果您正在反思並編寫自己的協議處理程序,您可能已經知道了這一點,但我不確定是否有更好的方法來獲得您想要的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM