【问题标题】:Visual Studio: Is there a "move class to different namespace" refactoring?Visual Studio:是否有“将类移动到不同的命名空间”重构?
【发布时间】:2008-10-06 13:07:19
【问题描述】:

我正在做一些架构清理,包括将一堆类移动到不同的项目和/或命名空间中。目前我正在手动移动文件,构建,然后根据需要手动添加 using Foo 语句以解决编译错误。有人知道这样做的更聪明的方法吗? (我们是 CodeRush 和 Refactor!商店,但我很想知道 Resharper 是否对此提供支持)

【问题讨论】:

  • “重复”问题现在指向这里。我的堆栈刚刚溢出...
  • @Liam -- 骗子没有我能看到的答案。
  • @rory.ap 这些问题(在某些时候)被合并了

标签: visual-studio refactoring


【解决方案1】:

Visual Studio 2019 提供至少 2 个内置选项:

'Move to namespace...'重构可以在任何类上触发,VS会提示输入目标命名空间。

'Change namespace to...' 重构用于当前文件命名空间与文件夹结构不匹配时。

这可用于将单个类移动到不同的命名空间:

  1. 创建所需的文件夹结构
  2. 移动文件
  3. 应用上述重构(CTRL+. 将光标悬停在命名空间上)

这些操作确保所有引用都相应更新。

【讨论】:

  • 移动到命名空间不会改变引用。我没有将命名空间更改为,它是企业独有的功能吗?我有专业的。
  • 我在 VS 社区中看到了这两个选项,并且“移动到命名空间”确实更新了引用
  • 移动到命名空间确实会更新引用。它没有更新文件中具有更多类型的类的引用。我还注意到这对于部分课程根本不起作用。感谢您的确认:)
  • 这应该是目前公认的答案,因为它提供了一个与当前版本的 VS 没有任何第三方解决方案的解决方案。
  • 当我打开Quick Actions and Refactorings... 菜单时,我是唯一一个没有看到Move to namespace... 的人吗?我只有Generate constructor...Generate overrides...Extract Interface...。可能是重构只适用于 C# 而不是 VB.. 可惜..
【解决方案2】:

Visual Studio 2010 可以重命名命名空间。将光标放在命名空间名称上,然后按 F2。或者干脆在代码中重命名,看到红色曲线出现后按Shift+Alt+F10Enter .

Reharper 也可以rename namespaces。引用:

重命名命名空间重构 允许用户重命名特定的 命名空间并自动更正 所有对命名空间的引用 代码。下面的用法是 改名:

  • 命名空间语句
  • 使用指令
  • 类型的限定名称

【讨论】:

  • 当您想将标识符移动到命名空间中时,这有什么帮助?
  • @sbi 通过将类所在的命名空间重命名为新名称?
  • @Igor:再次阅读问题。 oleks 想要将命名空间划分为子命名空间。这意味着将NS::C 移动到NS::NS1::C。重命名命名空间可以做到这一点吗?
  • @sbi - 可以。您可以在 VS 中创建新的命名空间(即创建与新命名空间对应的文件夹结构),然后将类型拖放到新文件夹中。 Resharper 现在将警告您这些类型位于与其文件夹结构(即新名称空间)不对应的名称空间(旧名称)中。然后它为您提供纠正它们的机会;这将仅更新已移动到新命名空间或子命名空间的类型。
  • 我试过 resharper,是的,正如 Rob Levine 指出的那样 - 如果您的命名空间不适合文件夹结构,它会抱怨并让您选择修复它。虽然这非常适用于例如一个 dll 项目,它不是一个网站,你的代码(按照惯例)应该在 App_Code 目录中。它建议我创建一个命名空间 App_Code.SomeNameSpace.SomSubNameSpace -- 不是很好。
【解决方案3】:

如 cmets 中所述,此答案现已过时。请看up-to-date answer below


Resharper 是我所知道的唯一具有此功能的工具。 CodeRush 和 Refactor 中还缺少许多其他功能!

【讨论】:

  • 在大多数情况下,我真的很喜欢 DevExpress 工具,但是移动文件的能力似乎是一个如此简单的功能,以至于我很惊讶它的缺失。我一直想试驾 Resharper,也许是时候了……
  • ReSharper 更干净 - 不会在我的源代码中添加大量彩色垃圾。
  • @dmitri - 是的,它确实很吵,尤其是当你像我一样同时运行两者时;p 如果这让你感到困扰,你可以在选项中打开绘画。
  • 目前答案不正确,对于 VS 2019 解决方案,请参见 answer below
【解决方案4】:

此答案至少适用于 Visual Studio 2013 和 2015无需重新锐化器

  1. 将类文件移动到新文件夹
  2. 打开“查找和替换”
  3. 选择“在文件中替换”
  4. 在“查找内容”字段中键入 original 命名空间定义,例如。 MyCorp.AppStuff.Api
  5. 在“替换为”字段中键入 new 命名空间定义,例如。 MyCorp.AppStuff.Api.Extensions
  6. 使用“查找”字段的浏览按钮 ... 选择新文件夹,或输入文件夹路径
  7. 全部替换按钮

【讨论】:

  • 这仅在您不将某些内容从一个命名空间(您仍想使用)移动到另一个命名空间时才有效。这基本上仅在您完全重命名命名空间时才有效。
  • @Blackclaws 我觉得第 1 步和第 6 步涵盖了这一点
  • 啊,我明白你的意思了。由于您仅在该新文件夹中进行替换,因此您不会更改该名称的所有提及。但是,它可能仍然会让您陷入大量未定义的引用,因为所有使用该类的类都必须更新其 using 指令……我真的希望他们已经实现了这样的功能。
  • @Blackclaws 我也是。我使用 resharper 但我发现它变化太大
  • 如果您在单个文件夹中混合了命名空间,请使用从单词 namespace 开始的正则表达式进行匹配。
【解决方案5】:

对于 VS 2015 和 VS 2017 没有 Resharper 有部分解决方案,使用免费扩展。

我今天(2017 年底)喜欢的一个扩展是 Fix Namespace VS 扩展: https://marketplace.visualstudio.com/items?itemName=vs-publisher-599079.FixNamespace#overview

它分析您的解决方案的文件夹结构并使用它提供命名空间重构。不幸的是,它并不完美:它不能很好地跟踪依赖关系,但为我解决了大部分工作。

【讨论】:

    【解决方案6】:

    使用 Resharper:CTRL+R+O

    然后按两次向下箭头键选择将类型移动到另一个命名空间

    【讨论】:

      【解决方案7】:

      由于提供了上述答案(我猜),此功能已添加到 CodeRush。只需将克拉放在要移动的 Type 上,您就会在 Refactor 上看到 Move Type to Namespace 选项!上下文菜单。这会将类型移动到新的命名空间并更新引用。不过,您可能仍希望将文件移动到与命名空间名称匹配的解决方案文件夹中。

      【讨论】:

      • 不适用于 Visual Studio 2013 Professional。您是否偶然使用了 Resharper?
      • 我指的是 CodeRush/Refactor!上下文菜单,而不是 Visual Studio 的。
      • 啊,抱歉,一开始没有意识到这一点。也许编辑您的答案以澄清,因为股票 Visual Studio 确实具有“重构”功能(不是说它非常强大或任何东西:-P ...)。
      • 我不明白为什么VS没有这样的功能。他们是否已经与 JetBrains 上床了?
      【解决方案8】:

      这不是最好的结果,但可以在没有插件或工具的情况下完成,只能使用 Visual Studio。在整个解决方案中查找和替换,匹配大小写,匹配整个单词。 查找内容:类名,替换为:New.Namespace.ClassName(完全限定的类名)。

      如果您在旧命名空间中有 100 多个已移动类和其他类的引用,那么哪些没有被移动,这是我找到的唯一万无一失且免费的解决方案。导致错误的唯一情况是您在其他命名空间中具有相同的类名。

      【讨论】:

        【解决方案9】:

        如果您不能或不想使用 Re$harper,Notepad++ 是您的朋友:

        1. 确保您没有在 Visual Studio 中为需要移动到新命名空间的文件保留更改
        2. 打开所有包含需要在记事本++中更改的命名空间的文件
        3. 打开 查找和替换 (CTRL + H)
        4. 填写查找内容并替换为字段
        5. 全部替换所有打开的文档
        6. 保存所有所有文档中的更改(CTRL + SHIFT + S)
        7. 切换到 Visual Studio 并重新加载所有文档(提示时Yes to all

        完成

        【讨论】:

        • 当我已经在 Visual Studio 中拥有这些文件时,我为什么要在 Notepad++ 或任何编辑器中打开它们,我可以在整个解决方案中使用查找和替换?这个解决方案的另一个问题是它会改变使用同一命名空间中其他类可能需要的东西。
        • 完全没有,因为您可以将namespace A.B.C 替换为namespace X.Y.Z 而不会影响usings。该解决方案是有效的,即使您可以使用 Visual Studio 来完成我不记得为什么 2 年前我提出了这个。无论如何,downvoting 似乎有点激进,因为这个答案既不误导也不危险。
        • 假设您在命名空间 Foo.Bar 中有类 A 和 B,并且 A 被移动到 Foo.Baz。如果我理解正确,您的建议是将“使用 Foo.Bar”替换为“使用 Foo.Baz”。这次替换的结果是找不到class B,所以必须手动添加“using Foo.Bar”,所以替换没有解决如何避免手动更新的问题。
        猜你喜欢
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多