问题 更改高度引用类的命名空间的最佳方法是什么?


我试图将一个高度引用的类从一个名称空间移动到另一个名称空间。简单地将文件移动到具有不同根命名空间的新项目中会导致整个解决方案中出现1100多个错误。

对类的一些引用涉及完全限定的namescape引用,其他引用涉及命名空间的导入。

我尝试使用重构工具(Refactor Pro)来重命名命名空间,希望对类的所有引用都会改变,但这导致了上述问题。

任何人都有如何应对这一挑战的想法,而无需手动钻取每个文件并更改完全限定的命名空间或导入新的命名空间(如果它尚不存在)?

谢谢。


11227
2018-05-12 03:44


起源

对于那些引人注目的问题。我尝试了Resharper,这让事情变得非常混乱。最后,基本的“替换文件”完成了这项工作。对此的技术是首先替换所有高度限定的引用,然后更低限定,然后手动修复导入。这花了我30分钟。横切关注是一种痛苦。 - Llyle


答案:


尝试使用 ReSharper的。 我过去曾使用它来重构高度引用的命名空间,完全限定和导入完全没有任何问题。


5
2018-05-12 03:50



绝对是一个选项,我宁愿不需要为一个命名空间更改而掏出一大堆现金:) - Llyle
我知道Resharper很贵,但现在我不能没有它。 - CodeLikeBeaker
这不是一堆现金。它会在一周内收回成本。 - Jon Erickson


这是一个 电源外壳 我用来完成痛苦的命名空间重命名的脚本。在我的情况下,大约有5000个VB.Net和C#源文件大量使用公共库(CSLA)。由于不值得讨论的原因,我需要重命名命名空间 CSLA 至 CslaLegacy。只需很少的努力,您就应该能够根据您的特定需求调整此脚本。该脚本以递归方式搜索源树,查找.vb和.cs文件。 $ repValues哈希表包含需要替换的字符串。如果重命名包含程序集名称更改,则此脚本的变体也可用于更新项目引用。您可以在修改之前添加对源代码管理工具的调用以签出文件。我最初是为TFS做的,但发现执行tf.exe很慢。最后,在运行脚本之前简单地检查整个源树要快得多。我用 的PowerGUI 用于调试和运行powershell脚本的脚本编辑器。

$root = "c:/path/to/your/source"

cd $root
$files = Get-ChildItem -Path $root -Recurse -include *.cs,*.vb 

$repValues = 
@{
'using Csla;'              = 'using CslaLegacy;';
'using Csla.Validation;'   = 'using CslaLegacy.Validation;';
'using Csla.Data;'         = 'using CslaLegacy.Data;';
'Imports Csla'             = 'Imports CslaLegacy';
'Imports Csla.Validation'  = 'Imports CslaLegacy.Validation';
}

$stmtsToReplace = @()
foreach ($key in $repValues.Keys) { $stmtsToReplace += $null }
$repValues.Keys.CopyTo($stmtsToReplace, 0)

foreach ($file in $files)
{
$path = [IO.Path]::Combine($file.DirectoryName, $file.Name)

$sel = Select-String -Pattern $stmtsToReplace -Path $path -l

if ($sel -ne $null)
{
    write "Modifying file $path" 

    (Get-Content -Encoding Ascii $path) | 
    ForEach-Object {
        $containsStmt = $false
        foreach ($key in $repValues.Keys) 
        {
            if ($_.Contains($key))
            { 
                $_.Replace($key, $repValues[$key])
                $containsStmt = $true
                break
            }
        }
        if (!$containsStmt) { $_ } 
    } |
    Set-Content -Encoding Ascii $path
}
}

4
2018-06-19 17:41





如果它对你的情况有帮助我不会。

  1. 修改命名空间,VS IDE将在命名空间的末尾显示小红色矩形。
  2. 按Ctrl +。并选择您最喜欢的选项。

如果您使用的是ReSharper之类的工具,请单击命名空间并按Ctrl + R.按照“重命名命名空间”对话框中的说明操作


1
2018-05-12 03:49



这正是我想要避免的。进入每个文件以纠正1100多个错误似乎没有使用开发人员时间。 - Llyle
你不需要纠正。 VS或ReSharper将为您重构它。您只需要修改名称空间一个文件,并且将在使用相同名称空间的所有文件中修改名称空间。 - Vadim
使用Visual Studio 2008 Standard Edition来纠正每个1100多个错误是一个手动过程,需要很长时间。 ReSharper是一个选项,但为命名空间更改添加另一个重构工具似乎有点过分。 - Llyle
正如Vadim所说,这不是一个手动过程 - VS为你做了大部分工作。可能是标准版中缺少的东西。 - UpTheCreek


看起来你不应该在全局搜索和替换完全限定名称时遇到太多麻烦。所以在oldspace :: myclass上进行搜索并将其替换为newspace :: myclass。在文件顶部添加行也不是很难,你可以替换

using oldspace;

using oldspace;
using newspace;

当然,这样的方法存在一些风险。很容易引起自己微妙的问题。


1
2018-05-12 03:53



对于初学者来说,它是VB,而不是基于C语言,但是指定两者的想法可以通过正则表达式全局替换来完成。但是,然后我得到超过500错误,其中命名空间被导入两次:) - Llyle
啊,抱歉,我错过了标签,问题没有说明。我必须承认,当搜索和替换解决方案开始耗时超过半小时时,我通常会给自己编写一个自定义搜索和替换工具来处理我的具体情况。听起来好像有人已经编写了你需要的工具,所以你只需要决定是否要付钱;)。 - AHelps


切换到c锐利的另一个原因。重构VS 2008中免费内置的源代码。


-1
2018-04-12 16:49