我试图将一个高度引用的类从一个名称空间移动到另一个名称空间。简单地将文件移动到具有不同根命名空间的新项目中会导致整个解决方案中出现1100多个错误。
对类的一些引用涉及完全限定的namescape引用,其他引用涉及命名空间的导入。
我尝试使用重构工具(Refactor Pro)重命名命名空间,希望对该类的所有引用都会发生变化,但这会导致上述问题。
任何人都有如何解决这一挑战的想法,而无需手动钻取每个文件并更改完全限定的命名空间或导入新的命名空间(如果它尚不存在)?
感谢。
答案 0 :(得分:5)
尝试使用Resharper.我过去曾使用它来重构高度引用的命名空间,无论是完全限定还是导入都没有问题。
答案 1 :(得分:4)
这是我用来完成痛苦的命名空间重命名的Powershell脚本。在我的情况下,大约有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
}
}
答案 2 :(得分:1)
如果它对您的情况有帮助,我不会这样做。
如果您使用的是ReSharper之类的工具,请单击命名空间并按Ctrl + R.按照“重命名命名空间”对话框中的说明进行操作。
答案 3 :(得分:1)
您似乎不应该在执行全局搜索时遇到太多麻烦并替换完全限定名称。所以在oldspace :: myclass上进行搜索并将其替换为newspace :: myclass。在文件顶部添加行也不是很难,你可以替换
using oldspace;
与
using oldspace;
using newspace;
当然,这样的方法存在一些风险。很容易引起自己微妙的问题。
答案 4 :(得分:-1)
切换到c sharp的另一个原因。重构VS 2008中免费内置的源代码。