2009-05-12 11 views
11

Sto tentando di spostare una classe con riferimenti elevati da uno spazio dei nomi a un altro. Semplicemente spostando il file nel nuovo progetto che ha uno spazio dei nomi di root diverso, si ottengono oltre 1100 errori nella mia soluzione.Qual è il modo migliore per cambiare lo spazio dei nomi di una classe ad alto riferimento?

Alcuni riferimenti alla classe implicano un riferimento al namescape completo e altri implicano l'importazione dello spazio dei nomi.

Ho provato a utilizzare uno strumento di refactoring (Refactor Pro) per rinominare lo spazio dei nomi, nella speranza che tutti i riferimenti alla classe cambiassero, ma questo ha provocato il suddetto problema.

Chiunque ha idee su come affrontare questa sfida senza dover eseguire il drill in ogni file manualmente e modificando lo spazio dei nomi completo o importando quello nuovo se non esiste già?

Grazie.

+1

Per coloro che hanno riscontrato questo problema. Ho provato Resharper, che ha creato un vero casino. Alla fine un "Sostituisci in File" di base ha fatto il lavoro. La tecnica per questo era di sostituire prima tutti i riferimenti altamente qualificati e quindi meno qualificati e quindi di fissare manualmente le importazioni. Mi ci sono voluti 30 minuti. Le preoccupazioni trasversali sono un dolore. – Llyle

risposta

5

Provare a utilizzare Resharper. L'ho usato in passato per refactoring spazi dei nomi altamente referenziati sia pienamente qualificato e importati senza alcun problema.

+0

Sicuramente un'opzione, preferirei non dover sborsare un sacco di soldi per un cambio di namespace però :) – Llyle

+1

So che Resharper è costoso, ma non posso vivere senza di esso ora. – CodeLikeBeaker

+1

non è un mucchio di soldi. si paga in una settimana. –

1

Non lo so se sarà utile nel tuo caso.

  1. Modificare lo spazio dei nomi, VS IDE ti mostrerà un piccolo rettangolo rosso alla fine del namespace.
  2. Premere Ctrl +. e seleziona l'opzione che più ti piace.

Se si utilizza lo strumento come ReSharper, fare clic sullo spazio dei nomi e premere Ctrl + R. Seguire le istruzioni nella finestra di dialogo Rinomina spazio dei nomi.

+0

Questo è esattamente quello che voglio evitare. Entrare in ognuno dei file per correggere 1100+ errori non sembra un uso molto produttivo del tempo di sviluppo. – Llyle

+0

Non è necessario correggere. VS o ReSharper effettueranno il refactoring per te. È necessario modificare lo spazio dei nomi solo un file e lo spazio dei nomi verrà modificato in tutti i file che utilizzano lo stesso spazio dei nomi. – Vadim

+2

L'utilizzo di Visual Studio 2008 Standard Edition per correggere ciascuno degli errori 1100+ è un processo manuale e richiede molto tempo. ReSharper è un'opzione, ma l'aggiunta di un altro strumento di refactoring per cambiare lo spazio dei nomi sembra eccessivo. – Llyle

1

Sembra che non dovresti incontrare troppi problemi nel fare una ricerca globale e sostituirla con il nome completo. Quindi fai una ricerca per tutti su oldspace :: myclass e sostituiscilo con newspace :: myclass. Aggiunta di righe all'inizio di un file non è terribilmente difficile sia, e probabilmente si potrebbe sostituire

using oldspace; 

con

using oldspace; 
using newspace; 

Ci sono alcuni rischi con un approccio come questo, naturalmente. È abbastanza facile causarti problemi sottili.

+0

Per i principianti è VB, non un linguaggio basato su C, ma l'idea di specificare entrambi può essere eseguita con la sostituzione globale di espressioni regolari. Ma, poi ottengo oltre 500 errore in cui lo spazio dei nomi viene importato due volte :) – Llyle

+0

Ah, mi dispiace, ho perso il tag, e la domanda non ha specificato. Devo ammettere che, quando le soluzioni di ricerca e sostituzione iniziano a richiedere più di mezz'ora, di solito mi scrivo uno strumento di ricerca e sostituzione personalizzato per gestire la mia situazione specifica. Sembra che qualcuno abbia già scritto lo strumento di cui hai bisogno, quindi devi solo decidere se vuoi pagare per questo;). – AHelps

4

Ecco uno script Powershell che ho utilizzato per eseguire una ridenominazione dello spazio dei nomi doloroso. Nella mia situazione c'erano circa 5000 file sorgente VB.Net e C# che fanno un uso pesante di una libreria comune (CSLA). Per ragioni che non vale la pena di discutere, ho dovuto rinominare lo spazio dei nomi Csla a CslaLegacy. Con il minimo sforzo, dovresti essere in grado di adattare questo script alle tue esigenze specifiche. Lo script ricerca ricorsivamente nell'albero dei sorgenti cercando i file .vb e .cs. La tabella hash $ repValues ​​contiene le stringhe che devono essere sostituite. Una variante di questo script può anche essere utilizzata per aggiornare i riferimenti del progetto, nel caso in cui il tuo nome includa la modifica del nome di un assembly. È possibile aggiungere una chiamata allo strumento di controllo del codice sorgente per verificare il file prima della modifica. Inizialmente l'ho fatto per TFS, ma ho trovato lento l'esecuzione di tf.exe. Alla fine è stato molto più veloce semplicemente eseguire il checkout dell'intero albero dei sorgenti prima di eseguire lo script. Io uso l'editor di script PowerGUI per il debug e l'esecuzione di 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 
} 
} 
-1

Un altro motivo per passare a c sharp. Refactoring del codice sorgente integrato gratuitamente in VS 2008.

Problemi correlati