2012-06-22 66 views
4

我遇到以下問題,開始驅使我瘋了。 我在Assembly1中有一個類Class1。我在Assembly2中移動了Class1到Assembly2和廢棄Class1(保持相同的命名空間,我現在不能刪除它以避免我的用戶發生重大更改)。兩個引用程序集之間的類型歧義

現在我有一個引用Assembly1和Assembly2的單元測試程序集TestAssembly2。現在我在單元測試中嘗試使用Class1時遇到編譯問題Class1。這是有道理的,因爲我在Assembly1和Assembly2中都有兩個Class1

問題 有沒有辦法來告訴編譯器使用Assembly2定義Class1(作爲一個在Assembly1是過時的)不Assembly1?

編輯我不能使用轉發類型爲Assembly1不得有Assembly2 :(

+0

你爲什麼不代碼中的 – Boomer

+0

使用Assembly2.Class1那怎麼可以呢? – GETah

+0

@Boomer這不起作用。程序集名稱不能像命名空間一樣使用(並且這兩個類與GETah說的都在同一個命名空間中)。這需要一個外部別名,詳見下面的答案。 – Botz3000

回答

5

參考你可以嘗試TypeForwardedTo屬性。

[assembly:TypeForwardedTo(typeof(Class1))] 

這樣,你可以移動的類型到另一個程序集完全不會破壞任何東西,甚至不需要重新構建引用程序集,因爲運行時會爲您處理轉發問題
有關詳細信息,請參閱此處:
Type forwarding using TypeForwardedTo attribute

編輯:如果不能從Assembly1引用Assembly2,你可以定義一個extern alias
MSDN Documentation for extern alias (C# Reference)

您可以通過在解決方案資源管理和編輯選擇參考裝配定義它們屬性窗口中的別名。

然後你只需要用yourAlias::Class1來確定你的類型。

+0

感謝您的答案,+1。我不能使用類型轉發,因爲Assembly1不能引用Assembly2 :( – GETah

+0

@GETah好吧,那麼還有另一種可能性,即使用extern別名。更新我的答案。 – Botz3000

+0

很酷,解決了我的問題:) – GETah

3

你應該別名你的程序集。

在您的消費項目的參考節點下,選擇Assembly2並設置不同的「別名」,例如「a2」。

在您的代碼中還添加extern alias a2

比您需要參考此類型時,請使用a2::YourName.Class2。這將消除歧義。

Jon Skeet has already explaining how this works

相關問題