2017-05-05 79 views
0

我有一個Visual Studio解決方案,其中包含三個C#項目,每個項目編譯爲三個不同的DLL。我們稱之爲主要的Logic。另外兩個是可選的,可以包含在其他應用程序中,但不包括主DLL。我們打電話給另外兩個Logic.EditorLogic.OptionalLogic。它們都依賴主DLL Logic用反射觸及其他子庫(C#)

這是我想要的架構,因爲通常Logic.EditorLogic.OptionalLogic不通信。我現在遇到了一種情況,如果在Logic.OptionalLogic的某個類的實例中發生了某種情況,我想在Logic.Editor的類Logic.Editor.EditorWindow中調用它發生的靜態方法。原始圖書館Logic根本不感興趣。

我在想,我會用反射,但大部分我覺得需要的例子訪問實際庫/組裝/命名空間和/或類能夠提取該類型的方法。例如

System.Reflection.Assembly.GetAssembly(System.Type type); 

需要組裝,這是無法訪問的類型,

System.Type.GetType("Logic.Editor.EditorWindow"); 

返回NULL,恐怕是因爲Logic.Editor沒有找到,所以我不能叫GetMethod就可以了。

是否有可能通過反射從程序集中的類中檢索一個靜態方法,除了已知字符串之外,這對我來說是無法訪問的,並且可選地在發現它時調用它(如果其他程序集包含在結束項目)?

我僅限於C#4和.NET 3.5。

+1

嚴重錯誤的方法恕我直言。由於從'Logic.OptionalLogic'到'Logic.Editor'存在一些依賴關係,因此直接從前者引用後者。如果確實有某些原因希望保持這些完全分離,請在'Logic'中實現一些開放式消息中心(即使是非常簡單的消息中心)。然後'Logic.OptionalLogic'可以通知訂戶,'Logic.Editor'可以訂閱這些事件 - 而且他們都不需要了解彼此的任何信息。 – decPL

+1

感謝您的反饋。我沿着這些線路的思考,但不喜歡在不屬於那裏的邏輯庫引入代碼的想法,但我想你是對的 - 我沒有處理這個正確的方式。 – Helena

回答

0

您可以在Logic中定義delegate,在Logic.Editor中實現它,並在Logic.OptionalLogic中調用它。如果Logic.OptionalLogic沒有委託集,則不要調用它。

+0

謝謝你,這是有可能做的伎倆的方法,是的。 – Helena