簡體   English   中英

如何指定幾個不明確的點標記名稱空間之一

[英]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 的反向引用,這就是導致循環引用的原因。

為了解決這個問題,我做了以下事情:

  1. 在項目 B 中定義了一個接口,該接口適用於我在項目 A 中定義的新 class

  2. 讓Project A class擴展這個接口

  3. 更改項目 B 中對項目 A class 的引用,以引用接口而不是定義的 class。這樣做消除了對反向引用的需要。

抱歉,這太含糊了,但它是專有代碼(而且非常復雜),所以在這里發布不切實際,但我想我已經概括了解決方案的要點。

暫無
暫無

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

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