如何指定几个不明确的点符号名称空间之一



编辑。。。

请注意,我正在更改对文件夹的伪引用,以更正确地反映它们不是文件夹,而是命名空间。这里的一些评论来自变更之前


我对C#很陌生,所以如果我说了不正确的话,请原谅我。

我在一个有很多项目的大型解决方案中工作。

我被要求将命名空间中定义的特定类从其中一个项目移动到另一个项目。然而,当我这样做的时候,问题是有一个对象定义没有被正确引用。这里有一个例子:

原始结构:

此文件:

MainSecond.Level.DataSecond.Level.Data.csproj:

最初有这样一行代码:

<Compile Include="SomeNestedFileWayDown.cs" />

此外,这里引用了一个实际的文件:

MainSecond.Level.DataSomeNestedFileWayDown.cs

新结构:

首先,我们从'Main\Second中删除了Compile行。数量数据\秒。数量Data.csproj,并在新的命名空间中添加了类似的代码行,如下所示:

File: MainMain.DataAccessMain.DataAccess.csproj

新增代码行:

<Compile Include="NewLocationofDown.cs" />

我们把实际的文件移到了新的位置,现在是:

MainMain.DataAccessNewLocationofDown.cs

完成后,除了一个引用之外,所有引用(也就是所有using语句)似乎都能工作。有一个使用语句是这样的:

using Main.Second.Level.Data.Yet.Another.Nested.File.Objects

在旧名称空间中,这个using语句运行良好,但在新名称空间中则不然。具体来说,它在第三个元素(Level)上失败。我的IDE给出一个错误,说";无法解析符号"级别";。

我高度怀疑发生这种情况的原因是实际上存在另一个名称空间,它的名称只是"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.ProjectOther.Project.csproj">
<Project>{fh9w8es3-nota-real-guid-example1}</Project>
<Name>Other.Project</Name>
</ProjectReference>
<ProjectReference Include "..Main.Second.LevelOther.Project.csproj">
<Project>{AD8234HS-NOTA-REAL-GUID-EXAMPLE2}</Project>
<Name>Main.Second.Level</Name>
</ProjectReference>
</ItemGroup>

注意,在执行此操作时,我必须为Project元素提供一个guid。我推断(经过研究),这个guid将是当前存在于解决方案根的解决方案文件中的guid,特别是它是该项目显示的第二个guid。我上面的例子正是我制作代码的方式(特别是从解决方案文件复制的GUID都是大写的,因为csproj文件中的GUID不是

然而,这并不能解决我的问题。然而,我觉得我离一项决议已经很近了。

我提出的原始问题的正确答案是,您需要将ProjectReference添加到ItemGroup,如我在原始问题上发布的附录中所述。

然而,在我的特殊情况下,这是不可能的,因为这样做会引起循环引用。示例:

项目A:参考了项目B项目A:广泛定义和使用内部类,也在项目B 中使用类

项目B:具有仅在项目B 中使用的类

我的更改试图将项目A中的一个类添加到项目B中,但这样做需要添加对项目A的反向引用,这就是循环引用的原因。

为了解决这个问题,我做了以下操作:

  1. 在项目B中定义了一个接口,该接口将适用于我在项目A 中定义的新类

  2. 使项目A类扩展此接口

  3. 将项目B中对项目A类的引用更改为引用接口,而不是已定义的类。这样做消除了对反向引用的需要。

很抱歉,这太模糊了,但这是专有代码(而且非常复杂),所以在这里发布并不实用,但我认为我已经概括了解决方案的要点。

相关内容

最新更新