VSCODE 使用命名空间声明创建新 C# class 的代码片段

VSCODE snippet for creating new C# class with namespace declaration

目前我们只能创建新的 filefolder。而且每次创建class声明都要写命名空间,非常烦人。

但是是否可以创建新的 C# class 文件并在其中自动生成适当的命名空间?或者那里有一些片段?

这目前是不可能的。您无法在 Visual Studio 代码的片段声明文件中检索当前文件名、目录或其他信息。

您可以创建一个片段,让您输入命名空间和 class 名称。但我想这对你帮助不大。尽管如此,它看起来像这样:

 "Namespace and class": {
    "prefix": "namespaceAndClass",
    "body": [
        "namespace ",
        "{",
        "   class ",
        "   {",
        "",
        "   }",
        "}"
    ],
    "description": "Create a namespace block with a class"
 }

如果您真的想要一个根据文件路径填写正确命名空间和class名称的片段,您可以查看OmniSharp project.这可以让您了解如何改进 csharp-o 扩展,以便提供正确的数据作为插件内的建议。 但我认为这是一个比你自己输入 namespace 和 class 更大的任务。

This extension 提供上下文菜单按钮来添加新的 class,这将自动填充命名空间。

Visual Studio 自上次回答以来,代码发生了一些变化。它现在在片段中提供变量 TM_DIRECTORY,但这是一个绝对路径。我已提交 an enhancement request 以提供可以转换为名称空间的相对路径。但老实说,我认为上面的扩展程序满足了我的需求(上下文菜单是一个加号)

使用 vscode 的当前变量和正则表达式系统的中度脏解决方案如下:

假设您的所有项目都在 /your/projects/directory/

所以项目 #1 在 /your/projects/directory/Project1/
项目 #2 在 /your/projects/directory/Project2/
等等

以下代码片段将为所有子目录创建命名空间实现:

Linux/MacOS

"Namespace declaration":
{
    "prefix": "name",
    "description": "Creates a new namespace declaration.",
    "body":
    [
        "namespace ${TM_DIRECTORY/^\/your\/projects\/directory(\/([^\/]+))(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?(\/([^\/]+))?/${3:+.}${5:+.}${7:+.}${9:+.}${11:+.}${13:+.}${15:+.}${17:+.}${19:+.}/gi}",
        "{",
        "}"
    ]
}

Windows

"Namespace declaration":
{
    "prefix": "name",
    "description": "Creates a new namespace declaration.",
    "body":
    [
        "namespace ${TM_DIRECTORY/^c:\\your\\projects\\directory(\\([^\\]+))(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?(\\([^\\]+))?/${3:+.}${5:+.}${7:+.}${9:+.}${11:+.}${13:+.}${15:+.}${17:+.}${19:+.}/gi}",
        "{",
        "}"
    ]
}

说明

  1. 该代码段与您的基本目录和最多十个子目录相匹配(第一个目录是必需的 (\/([^\/]+)),而所有其他九个目录都是可选的 (\/([^\/]+))?
  2. 然后使用第一个匹配的目录创建命名空间指令
  3. 对于每个成功的附加子目录匹配,插入一个点 . (${3:+.}) 与该组的子匹配 ();对于不成功的组,不插入点并且子匹配为空

尽情享受吧:)

我发现这些扩展提供了创建 C# class 上下文菜单选项:

使用这个,首先它集中在命名空间的末尾添加任何附加部分。然后它集中在 class.

里面
"Namespace and Class": {
    "prefix": "nc",
    "body": [
        "namespace $WORKSPACE_NAME\n{\n\tpublic class $TM_FILENAME_BASE\n\t{\n\t\t\n\t}\n}"
    ],
    "description": "Generates namespace and class name"
}

发现此线程正在寻找相同的答案。

我没有找到任何现有的片段建议来生成正确的命名空间。
经过一些试验和错误后,我得到的最接近的,使用“variables" and "placeholder transformation”,是:

    "Namespace and Class": {
        "prefix": "nclass",
        "body": [
            "namespace ${RELATIVE_FILEPATH/[\\]|\w+\.cs$/./g}",
            "{",
            "\tpublic class $TM_FILENAME_BASE\n\t{\n\t\t[=10=]\n\t}",
            "}"
        ],
        "description": "Generates namespace and class name"
    }

这将从工作区中的文件夹结构生成命名空间,并使用文件名class命名。

但是这有一个问题,因为它会在命名空间末尾留下两个尾随 ..。 但是光标将停在那里,因此可以使用 Ctrl + Backspace 快速删除它们,然后再次使用 tab 跳转到 class.

的正文内部