【问题标题】:How can I Import A Namespace from A File in A Seperate Folder in C#如何从 C# 中单独文件夹中的文件导入命名空间
【发布时间】:2020-04-20 05:23:27
【问题描述】:

当定义此类的文件位于另一个文件夹中时,如何将扩展方法(见下文)引入当前命名空间?

StringHandler.cs 位于Product 文件夹中时,我可以将using Utilities; 包含在Product.cs 中,但是当它位于一个单独的文件夹中时,与Project 文件夹一起(在Utilities 文件夹中),我不知道如何包含它。有人可以解释一下在这种情况下如何使用 using 关键字吗?例如,using 真正指向我的文件系统上的哪个位置(我是否需要指定相对于我的 csproj 文件或我的 CallCenter.sln 文件的使用目录?)?

│   CallCenter.sln
│
├───src
│   ├───Project
│   │   │   Product.cs
|   |   |   Project.csproj
│   │   ├───bin
│   │   │   └───...
│   │   │
│   │   └───obj
│   │       └───...         
│   │
│   └───Utilities
│           StringHandler.cs

StringHandler.cs

namespace Utilities
{
    public static class StringHandler
    {
        public static string InsertSpaces(this string source)
        {
            string result = string.Empty;

            if (!string.IsNullOrWhiteSpace(source))
            {
                foreach (char letter in source)
                {
                    if (char.IsUpper(letter))
                    {
                        result = result.Trim();
                        result += " ";
                    }
                    result += letter;
                }
            }
            return result.Trim();
        }
    }
}

【问题讨论】:

  • 您必须将cs添加到项目中。 using语句是库名,与文件所在路径无关。使用 VS 菜单将 cs 文件添加到项目中: 项目:添加现有项目:浏览 cs 文件。添加文件后,您可以将命名空间添加到其他模块。

标签: c# namespaces using


【解决方案1】:

.cs文件所在的文件夹在编译时没有意义。 using 语句只允许找到来自某个命名空间的类型。为了能够使用扩展方法,请确保:

  • 包含命名空间 (using Utilities;)
  • 文件 (StringHandler.cs) 包含在您的项目中在您当前项目引用的另一个项目中

【讨论】:

  • or in another project that your current project has a reference to。这是否意味着我需要在Utilities 文件夹中添加dotnet new console,并在Project 文件夹的Project.csproj 文件中包含<PackageRefernce>Include 指令?
  • 认为您只想将 StringHandler.cs 添加到 Project.csproj 项目中,除非您想将这些实用程序放在单独的 dll 中。
  • 我希望它们在一个单独的 dll 中。但是将它们保存在单独的 dll 中是否有意义?我想将实用方法和扩展方法与我的业务逻辑分开存储,我发现将它们分开有助于增加心理障碍。我完全按照我上面提到的做了,而且没有问题。看起来 csproj 文件是关键。只要在那里指定了它们的位置,其他一切都应该没问题(包括命名空间)。我在 Project.csproj 中做了以下操作:<ItemGroup> <ProjectReference Include="..\Utilities\Utilities.csproj" /> </ItemGroup>
  • 为此,您需要创建一个单独的库项目并在需要的任何地方引用此项目,添加项目引用,这将允许使用包含项目命名空间using
  • 如果你有一堆相关的功能,把它们放在一个单独的 dll 中重复使用肯定是有意义的(例如,看看github.com/Humanizr/Humanizer#humanize-string(不是我的项目),一个 dll包含与您的扩展方法类似的各种功能)。
【解决方案2】:

当定义此类的文件位于另一个文件夹中时,如何将扩展方法(见下文)引入当前命名空间?

文件在哪里定义,文件夹方面,是无关紧要的。按照惯例,磁盘上的文件夹结构模仿命名空间,但并非必须如此。 using 将类型“带入”命名空间。 (并不是真正的“带来”——更像是“提供给”)。

就目标项目中的命名空间可用的源类型而言,它必须通过 a 物理上对您的项目可用

  • 从目标项目直接引用源项目
  • 从目标项目直接引用源 NuGet 包
  • 通过目标项目中另一个项目的传递依赖项间接引用源项目
  • 通过另一个项目的传递依赖项或目标项目中的 NuGet 包间接引用源 NuGet 包

逻辑上由

  • using 对源类型的声明

当 StringHandler.cs 在 Product 文件夹中时,我可以包含 using Utilities;在 Product.cs 中,但是当它在一个单独的文件夹中时,在项目文件夹旁边(在 Utilities 文件夹中),我不知道如何包含它。有人可以解释一下在这种情况下我如何使用 using 关键字吗?

您不能使用using 来访问StringHandler,因为您当前已经定义了您的结构。原因是StringHandler 不是任何项目的一部分。因为它不是任何项目的一部分,所以它违反了我上面列出的规则。

如您所愿使用using,您有两个简单的选择:

  • StringHandler 直接添加到需要它的项目中,或者如果您希望将StringHandler 分开,请将其添加到另一个项目并从目标项目中引用该项目。
  • 再多一点功夫,将StringHandler 留在原处(无项目),并在目标项目中包含指向该文件的链接。这有点作弊:它让StringHandler 看起来一直在Project 中。这种情况很少见;我个人只在我想包含例如通用程序集属性而不是通用代码时才这样做。

例如, using 真正指向我的文件系统上的哪个位置(我是否需要指定相对于我的 csproj 文件或我的 CallCenter.sln 文件的 using 目录?)?

再次,忘记目录/文件夹/磁盘结构。只考虑解决方案中的物理引用(基于项目/NuGet)和逻辑引用(基于命名空间)。它们通常与目录/文件夹/磁盘匹配,但并非必须如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2011-01-23
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2012-12-04
    • 2010-11-04
    相关资源
    最近更新 更多