Каков наилучший способ изменить пространство имен класса с высокой ссылкой? - PullRequest
11 голосов
/ 12 мая 2009

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

Некоторые ссылки на класс включают в себя полные ссылки на именные пространства, а другие - импорт пространства имен.

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

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

Спасибо.

Ответы [ 5 ]

5 голосов
/ 12 мая 2009

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

4 голосов
/ 19 июня 2009

Вот скрипт 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
}
}
1 голос
/ 12 мая 2009

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

using oldspace;

с

using oldspace;
using newspace;

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

1 голос
/ 12 мая 2009

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

  1. Измените пространство имен, VS IDE покажет вам маленький красный прямоугольник в конце пространства имен.
  2. Нажмите Ctrl +. и выберите наиболее понравившуюся вам опцию.

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

0 голосов
/ 12 апреля 2010

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

...