Какой лучший способ изменить пространство имен класса с высокой степенью привязки?

Я пытаюсь переместить класс с высокой степенью ссылки из одного пространства имен в другое. Простое перемещение файла в новый проект с другим корневым пространством имен приводит к более чем 1100 ошибкам в моем решении.

Некоторые ссылки на класс включают полностью квалифицированные ссылки на namescape, а другие - импорт пространства имен.

Я попытался использовать инструмент рефакторинга (Refactor Pro), чтобы переименовать пространство имен, в надежде, что все ссылки на класс изменились бы, но это привело к вышеупомянутой проблеме.

У кого-нибудь есть идеи о том, как решить эту проблему без необходимости вручную сверять все файлы и изменять полное пространство имен или импортировать новое, если оно еще не существует?

Спасибо.

Ответ 1

Попробуйте использовать Resharper. Я использовал его в прошлом для рефакторинга именных пространств с высоким ссылочным именем, как полностью квалифицированных, так и импортированных без каких-либо проблем.

Ответ 2

Здесь Powershell script, который я использовал, чтобы выполнить больное переименование пространства имен. В моей ситуации было около 5000 исходных файлов VB.Net и С#, которые сильно использовали общую библиотеку (CSLA). По причинам, которые не стоит обсуждать, мне нужно было переименовать пространство имен Csla в CslaLegacy. С минимальными усилиями вы сможете адаптировать этот script к вашим конкретным потребностям. script рекурсивно ищет исходное дерево, ищущее файлы .vb и .cs. Таблица хешей $repValues ​​содержит строки, которые необходимо заменить. Вариант этого script также может использоваться для обновления ссылок на проекты, если ваше переименование включает изменение имени сборки. Вы можете добавить вызов к исходному инструменту управления, чтобы проверить файл перед модификацией. Я изначально сделал это для TFS, но нашел медленным выполнение tf.exe. В конце было намного быстрее просто проверить всю исходную таблицу перед запуском script. Я использую PowerGUI script редактор для отладки и запуска скриптов 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

Я не буду, если это будет полезно в вашем случае.

  • Измените пространство имен, VS IDE покажет вам маленький красный прямоугольник в конце пространства имен.
  • Нажмите Ctrl+. и выберите наиболее подходящий вариант.

Если вы используете инструмент типа ReSharper, нажмите на пространство имен и нажмите Ctrl + R. Следуйте инструкциям в диалоговом окне "Переименовать пространство имен".

Ответ 4

Похоже, вы не должны сталкиваться с большими трудностями при выполнении глобального поиска и замене на полное имя. Итак, выполните поиск для всех в oldspace:: myclass и замените его на newspace:: myclass. Добавление строк в верхнюю часть файла также не очень сложно, и вы могли бы заменить

using oldspace;

с

using oldspace;
using newspace;

Конечно, есть определенные риски с подобным подходом. Это довольно легко вызвать у вас тонкие проблемы.

Ответ 5

Еще одна причина переключиться на c sharp. Рефакторинг исходного кода, созданного бесплатно в VS 2008.