代码之家  ›  专栏  ›  技术社区  ›  Llyle bonjorno

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

  •  11
  • Llyle bonjorno  · 技术社区  · 15 年前

    我正试图将高度引用的类从一个命名空间移动到另一个命名空间。只需将文件移动到具有不同根命名空间的新项目中,就会在整个解决方案中导致超过1100个错误。

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

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

    任何人都知道如何在不需要手动钻取每个文件、更改完全限定的名称空间或导入新名称空间(如果新名称空间不存在的话)的情况下解决此问题?

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  5
  •   Nick Heiner    14 年前

    尝试使用 Resharper. 在过去,我使用它重构高度引用的命名空间(完全限定和导入),完全没有问题。

        2
  •  4
  •   Todd Stout    15 年前

    这里有一个 Powershell 用于完成痛苦名称空间重命名的脚本。在我的情况下,大约有5000个vb.net和c源文件大量使用公共库( CSLA )出于不值得讨论的原因,我需要重命名名称空间 CSLA 律法主义 . 通过最少的努力,您应该能够使这个脚本适应您的特定需求。脚本递归地搜索源树以查找.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
    }
    }
    
        3
  •  1
  •   Vadim    15 年前

    如果这对你的案子有帮助的话,我不会的。

    1. 修改名称空间,vs ide将在名称空间的末尾显示一个红色的小矩形。
    2. 按Ctrl +。选择你最喜欢的选项。

    如果您使用的是像resharper这样的工具,请单击名称空间并按ctrl+r。按照“重命名名称空间”对话框中的说明操作。

        4
  •  1
  •   AHelps    15 年前

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

    using oldspace;
    

    具有

    using oldspace;
    using newspace;
    

    当然,这种方法也存在一些风险。很容易给自己带来微妙的问题。

        5
  •  -1
  •   James Westgate    14 年前

    切换到C夏普的另一个原因。在vs 2008中免费重构内置的源代码。