【问题标题】:C# wrong reference to namespaceC# 对命名空间的错误引用
【发布时间】:2018-03-18 14:30:25
【问题描述】:

好吧,这快把我逼疯了。我有一个几乎完成的项目(效果很好),我想以同样的方式制作另一个。问题是有一个包含两层 DataAccessLayer 和 BusinessLogicLayer 的解决方案。这两个层都有一个模型库,其中包含项目中的所有模型。我需要将模型从第一层转换为管理器库中的第二层模型。这适用于我收到的已完成项目,但我无法在我的项目中实现。 问题是我不能像他们在完成的项目上那样做必要的工作参考。结构是:

业务逻辑层

--经理

----用户

--模型

----用户

数据访问层

--模型

----用户

在 Managers 项目中,我添加了对 DataAccessLayer.Models 的引用。 在 Users 类中我得到了:

using Library.BusinessLogicLayer.Models;

现在在我的项目中,这条线是红色下划线的:

错误 CS0234 类型或命名空间名称“模型”不存在于 命名空间“Library.BusinessLogicLayer”(您是否缺少程序集 参考?)

我什至不确定这在那个原始项目上是如何以及为什么起作用的。但我无法弄清楚,所以它在我的项目上工作正常,结构完全相同。有人对此有任何想法吗?

编辑: 不知道为什么我没有早点上传这个。这是结构。 https://i.imgur.com/srnySFJ.jpg

编辑2: 由于不太好理解,所以我把整个项目上传到了 github 上,所以你可以仔细看看。 https://github.com/Morsusy2k/Library

这就是问题所在: https://i.imgur.com/DvCvnMA.jpg

【问题讨论】:

  • 确保您的项目拥有Rebuildstackoverflow.com/a/36655884/2946329
  • 重建了很多次,甚至删除了 bin/obj 文件夹,清除了解决方案,重新启动 PC 等等。
  • BusinessLogicLayer 和 DataAccessLayer 只是其中包含项目的解决方案文件夹吗?
  • 假设您确实在 Library.DataAccessLayer.Models 程序集的源代码中使用了此类命名空间定义,或者您命名该项目,那么您可能需要执行“使用 Library.DataAccessLayer.Models”。您是否有机会使用项目的默认命名空间设置?最好避免使用这样的东西,并在你的代码中有明确的命名空间。如果您重命名内容并忘记更改该内容,或者如果您忘记在更改后清理/重建,可能会导致问题
  • 您需要将每个文件中的namespace some_namespace.Layer.Folder { } 更新到您当前的位置,只要 VS 警报作为命名空间未找到。

标签: c#


【解决方案1】:

根据您上面的描述和我的理解,ManagersModels 似乎是两个不同的项目。如果是这种情况,请确保在 BusinessLogicLayer.Managers 中添加对 BusinessLogicLayer.Models 的引用。

另一方面,如果您只有两个项目 BusinessLogicLayerDataAccessLayer,那么很可能意味着 Library.BusinessLogicLayer.Models 不是命名空间的名称。

更新

从您添加的图片中,您可能需要添加对Library.BusinessLogicLayer.Models.Models 的引用。您有一个名为 Models 的文件夹和一个名为 Models 的项目。 Visual Studio 会根据解决方案名称、解决方案文件夹、项目名称、项目中的文件夹自动生成命名空间。

您的代码存在三个问题。第一个是您应该添加对Library.DataAccessLayer.Models 的引用和notLibrary.BusinessLogicLayer.Models 的引用。这是因为您在 DataAccessLayer.Models 中有 User,在 BusinessLogicLayer.Models 中有 User2

另外两个问题与 Map 方法有关,您向构造函数发送了错误数量的参数(您缺少 UserId),另一个问题是您的 DateOfBirthDateJoined 的顺序错误同样的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using global::Library.BusinessLogicLayer.Models;
using Library.BusinessLogicLayer.Managers.Properties;
using Library.DataAccessLayer.Models; // <-- Add reference to this

namespace Library.BusinessLogicLayer.Managers
{
    public class Users2
    {
        public IEnumerable<User> GetAll()
        {
            using(DataAccessLayer.DBAccess.Library library = new DataAccessLayer.DBAccess.Library(Settings.Default.LibraryDbConnection))
            {
                return library.Users.GetAll().Select(user => Map(user));
            }
        }

        private User Map(DataAccessLayer.Models.User dbUser)
        {
            if (dbUser == null)
                return null;

            // TODO: Constructor is missing a paremeter. I'll add a temporary one
            int tempUserId = 0;
            User user = new User(tempUserId, dbUser.Name, dbUser.UserName, dbUser.Password, dbUser.Email, dbUser.DateJoined, dbUser.DateOfBirth) // <-- The last two params are in the wrong order
            {
                Id = dbUser.Id
            };

            return user;
        }

        private Library.DataAccessLayer.Models.User Map(User2 user)
        {
            if (user == null)
                throw new ArgumentNullException("user","Valid user is mandatory!");

            return new DataAccessLayer.Models.User(user.Id,user.Name, user.UserName, user.Password, user.Email, user.DateJoined, user.DateOfBirth);
        }
    }
}

另外,关于您提供的最后一个屏幕截图,您没有 Library.BusinessLogicLayer.Models2 命名空间。删除数字 2 以使其工作。

由于我无权使用固定代码更新您的存储库,因此您必须根据我的回答手动修复它。否则,请告诉我,以便我们了解如何将代码推回。

【讨论】:

  • 我认为问题在于他们添加了来自 BusinessLogicLayer 的模型的引用,然后尝试使用来自 DataAccessLayer 的模型
  • @GeorgeBirbilis,是的,这可能是第三种情况。
  • 另外,那一行在我的代码中是错误的。程序找不到引用。
  • 不行,你需要添加对DataAccessLayer.Models的引用。是的,您可以向我发送邀请,以便我推送更改。
  • 我联系了编写工作示例的人。他忘了提到我需要手动编辑 .csproj 并重命名其中一个引用,以便我可以添加另一个.... -.- 谢谢你的所有麻烦。我修好了。
【解决方案2】:

您可以尝试以下几种方法:

  1. 此错误可能出现在BusinessLogicLayer 中,因为DataAccessLayer 未能构建。尝试自行构建 DataAccessLayer 以查看是否出现其他错误。
  2. 可能“添加”了引用,但您可能由于某种原因没有引用正确的 DLL 或版本。 Check your .csproj files manually 确保所有引用和版本都是正确的,具有正确的提示路径等。如果您有任何配置文件,您还应该检查它们以确保没有版本冲突。
  3. 除了检查引用之外,还可以添加if-then and switch case logic inside of the .csproj files。这是 Visual Studio 不通过其 GUI 支持的 MSBuild 功能,因此您可能需要在当前的 .csproj 文件中手动复制/更新此逻辑(如果存在)。
  4. 检查项目属性中的 default 命名空间,看看它们是否与旧项目相同。如果您在移至此项目后添加了新文件,则它们可能被无意中添加了错误的命名空间,并且该命名空间可能会导致冲突。您也可以尝试 using global::Library.BusinessLogicLayer.Models; 看看是否修复或更改了错误消息,或者至少 Intellisense 是否正在选择命名空间。
  5. 如果这不起作用,请检查所有 .cs 文件中的所有命名空间,以查看是否有任何流氓行为。
  6. 由于您的Models 命名空间存在问题,并且您有两个同名,请尝试将其中一个(是的,其中一个项目中的每个.cs 文件)临时重命名为Models2,看看是否它提供了一个线索(例如错误消失或改变)。

【讨论】:

  • 我检查了所有的 .csproj,它们看起来都很好。检查默认命名空间(我之前复制/粘贴的)它们也都很好。所有类名称空间也很好。我还添加了全局部分,结果相同。事情是 intelisense 只看到 Managers 项目,而不是 Models。
  • 如果您能看一下主帖中的第二个更新,我会很高兴。我将项目上传到 git,以便您更好地查看。谢谢(:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多