![](/img/trans.png)
[英]The type “Action<T1,T2,T3>” exists in 2 DLLs, how do I specify which one to use or just avoid one?
[英]How do specify one of several dot-notated namespaces which are ambiguous
編輯...
請注意,我正在更改對文件夾的虛假引用,以更恰當地反映它們不是文件夾而是名稱空間。 這里的一些評論來自該更改之前
我對 C# 很陌生,所以如果我說錯了,請原諒我。
我在一個包含許多項目的大型解決方案中工作。
我被要求將命名空間中定義的特定 class 從這些項目之一移動到另一個項目。 然而,當我這樣做時出現的問題是,有一個 object 定義不再被正確引用。 這是一個例子:
原始結構:
這個文件:
Main\Second.Level.Data\Second.Level.Data.csproj:
原來有這行代碼在里面:
<Compile Include="Some\Nested\File\Way\Down.cs" />
而且,這里還有引用的實際文件:
Main\Second.Level.Data\Some\Nested\File\Way\Down.cs
新結構:
首先,我們從 'Main\Second.Level.Data\Second.Level.Data.csproj 中刪除了 Compile 行,並在新命名空間中添加了類似的代碼行,如下所示:
File: Main\Main.DataAccess\Main.DataAccess.csproj
添加了新的代碼行:
<Compile Include="New\Location\of\Down.cs" />
我們將實際文件移動到現在的新位置:
Main\Main.DataAccess\New\Location\of\Down.cs
完成此操作后,所有引用(也就是所有 using 語句)似乎都有效,除了一個。 有一個 using 語句是這樣的:
using Main.Second.Level.Data.Yet.Another.Nested.File.Objects
在舊命名空間中,這個 using 語句工作正常,但在新命名空間中卻不行。 具體來說,它在第三個元素(級別)上失敗了。 我的 IDE 給出了一條錯誤消息“無法解析符號‘Level’”。
我高度懷疑發生這種情況的原因是實際上存在另一個名為“Main.Second”的名稱空間,其中包含它自己的 Main.Second.csproj 文件。 我不使用此文件夾或其中的文件做任何事情,但我不明白系統如何可能知道以下兩者之間的區別:
using Main.Second.Level.Data.Yet.Another.Nested.File.Objects
和
using Main.Second.Some.Other.Unrelated.Stuff
也就是說,我不明白點符號如何判斷名稱空間名稱的開始或結束位置。
附錄#1:
我確定問題是在目標項目的 csproj 文件中沒有對新項目的項目引用(或者至少我相當確定是這種情況)。 為了解決這個問題,我試圖手動添加這個引用。 請注意,我使用的是 JetBrains Rider IDE 並嘗試了幾種自動添加引用的方法,但都沒有奏效。
為了添加引用,我找到了包含所有其他項目引用的 ItemGroup 塊並添加了一個新塊。 它看起來像這樣:
<ItemGroup>
<ProjectReference Include "..\Other.Project\Other.Project.csproj">
<Project>{fh9w8es3-nota-real-guid-example1}</Project>
<Name>Other.Project</Name>
</ProjectReference>
<ProjectReference Include "..\Main.Second.Level\Other.Project.csproj">
<Project>{AD8234HS-NOTA-REAL-GUID-EXAMPLE2}</Project>
<Name>Main.Second.Level</Name>
</ProjectReference>
</ItemGroup>
請注意,在執行此操作時,我必須為 Project 元素提供一個 guid。 我推斷(經過研究)這個 GUID 將是當前存在於解決方案根目錄下的解決方案文件中的 GUID,具體來說,它是為該項目顯示的第二個 GUID。 我上面的示例正是我制作代碼的方式(特別是從解決方案文件復制的 GUID 全部大寫,而 csproj 文件中的則不是。
然而,這並沒有解決我的問題。 然而,我覺得我非常接近解決方案。
我提出的原始問題的正確答案是您需要將 ProjectReference 添加到 ItemGroup,如我在原始問題上發布的附錄中所述。
然而,在我的特定情況下,這是不可能的,因為這樣做會導致循環引用。 例子:
項目 A:參考了項目 B 項目 A:廣泛定義並使用了內部 class,並在項目 B 中使用了類
項目 B:具有僅在項目 B 中使用的類
我的更改試圖將項目 A 中的一個類添加到項目 B,但是這樣做需要添加對項目 A 的反向引用,這就是導致循環引用的原因。
為了解決這個問題,我做了以下事情:
在項目 B 中定義了一個接口,該接口適用於我在項目 A 中定義的新 class
讓Project A class擴展這個接口
更改項目 B 中對項目 A class 的引用,以引用接口而不是定義的 class。這樣做消除了對反向引用的需要。
抱歉,這太含糊了,但它是專有代碼(而且非常復雜),所以在這里發布不切實際,但我想我已經概括了解決方案的要點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.