簡體   English   中英

反射會在C#中失敗嗎?

[英]Can reflection ever fail in C#?

我們有一個正在用C#開發的應用程序。 我們將所有資源存儲在中央資源DLL中,該資源包含圖像,圖標和字符串,從中我們可以支持多種文化。

我們使用以下代碼從解決方案中的任何項目訪問資源;

private ResourceManager ResMan;
ResMan = new ResourceManager("libResx.Resource", Assembly.ReflectionOnlyLoad("libResx"));

然后,我們使用來訪問資源的任何元素。

btnClose.Text = ResMan.GetString("btnClose");

除了缺少資源DLL之外,還有什么可能導致反射無法找到資源DLL(程序集)的東西。 到目前為止,在測試中它是完美無缺的,當最終將其部署到野外時,我們應該注意什么?

反射會失敗嗎?

它可能會失敗。 您可以將程序集歸為屬性,以防止來自同一名稱空間之外的另一個程序集的反射。

查看每個API的參考文檔,以查看每個API可以引發的異常列表。

反射非常有用,但是由於更多實際原因,反射也會失敗。

最近在MVC Web應用程序(Castle MVC,Windsor,Brail&Boo)中發生了這種情況。 當boo腳本從propertybag編譯並訪問List時,它將使用反射來標識MyModel的簽名,以便隨后可以引用View的屬性。

在這種情況下反射失敗的地方是,MyModel的較早數據庫記錄不再與新模型同步,因為舊數據對MyModel的某些新屬性或屬性具有空值。 對於在新屬性字段中具有值的新記錄,這不是問題。

作為一般經驗法則,我會將程序集注冊為依賴項,然后將名稱空間放入您的using子句中。 這在編譯時為編譯器提供了清晰的依賴鏈。 這也使其他開發人員可以更輕松地確定特定庫所依賴的內容,而不必費力瀏覽大量代碼來查找對外部dll的隱藏的Assembly.Reflection.OnLoad調用。

另外,如果您希望ResourceManager進行很多更改,則應考慮完全將其單獨分成單獨的dll。 (與SOLID OOP設計原則一致)。 這使您的應用程序更具模塊化,如果您需要更新資源程序集,則只需重新編譯受影響的庫即可。

Bob叔叔-OOD原理(SOLID)

以我的經驗,我發現指定完整路徑比依賴程序集名稱更可靠。 您可以改用Assembly.ReflectionOnlyLoadFrom

暫無
暫無

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

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