2009-05-12 19 views
11

Estoy intentando mover una clase altamente referenciada de un espacio de nombres a otro. Simplemente mover el archivo al nuevo proyecto que tiene un espacio de nombres raíz diferente genera más de 1100 errores en toda mi solución.¿Cuál es la mejor manera de cambiar el espacio de nombres de una clase altamente referenciada?

Algunas referencias a la clase implican referencias completas de nombres de campos y otras implican la importación del espacio de nombres.

He intentado utilizar una herramienta de refactorización (Refactor Pro) para cambiar el nombre del espacio de nombres, con la esperanza de que todas las referencias a la clase cambien, pero esto dio como resultado el problema antes mencionado.

¿Alguien tiene ideas de cómo hacer frente a este desafío sin necesidad de profundizar en cada archivo manualmente y cambiar el espacio de nombres completamente calificado o importar el nuevo si no existe ya?

Gracias.

+1

Para aquellos que presentan este problema. Probé Resharper, lo que hizo un verdadero lío de cosas. Al final, un 'Reemplazo en archivos' básico hizo el trabajo. La técnica para esto era reemplazar todas las referencias altamente calificadas primero y luego calificar menos y luego arreglar manualmente las importaciones. Esto me llevó 30 minutos. Las preocupaciones transversales son un dolor. – Llyle

Respuesta

5

Probar usar Resharper. Lo he usado en el pasado para refactorizar espacios de nombres altamente referenciados, totalmente calificados e importados sin ningún problema.

+0

Definitivamente una opción, preferiría no tener que desembolsar un montón de dinero en efectivo para un cambio de espacio de nombres :) – Llyle

+1

Sé que Resharper es caro, pero no puedo vivir sin él ahora. – CodeLikeBeaker

+1

no es un montón de efectivo. se paga en una semana. –

1

No sé si será útil en su caso.

  1. Modifique el espacio de nombre, VS IDE le mostrará un pequeño rectángulo rojo al final del espacio de nombres.
  2. Presione Ctrl +. y seleccione la opción que más le guste.

Si está utilizando una herramienta como ReSharper, haga clic en el espacio de nombres y presione Ctrl + R. Siga las instrucciones en el cuadro de diálogo Cambiar nombre de espacio de nombres.

+0

Esto es exactamente lo que quiero evitar. Entrar en cada uno de los archivos para corregir más de 1100 errores no parece ser un uso muy productivo del tiempo del desarrollador. – Llyle

+0

No es necesario corregirlo. VS o ReSharper lo refacturarán por usted. Necesita modificar el espacio de nombres solo un archivo y el espacio de nombres se modificará en todos los archivos que usen el mismo espacio de nombres. – Vadim

+2

El uso de Visual Studio 2008 Standard Edition para corregir cada uno de los 1100 errores es un proceso manual y lleva mucho tiempo. ReSharper es una opción, pero agregar otra herramienta de refactorización para cambiar el espacio de nombres parece excesivo. – Llyle

1

Parece que no debe tener demasiados problemas para realizar una búsqueda global y reemplazar el nombre completo. Haga una búsqueda para todos en oldspace :: myclass y reemplácela por newspace :: myclass. Adición de líneas a la parte superior de un archivo no es muy difícil tampoco, y es probable que podría reemplazar

using oldspace; 

con

using oldspace; 
using newspace; 

Hay algunos riesgos con un enfoque de este tipo, por supuesto. Es bastante fácil provocarse problemas sutiles.

+0

Para empezar, es VB, no un lenguaje basado en C, pero la idea de especificar ambos se puede hacer con la expresión regular de reemplazo global. Pero, luego recibo un error de más de 500 cuando el espacio de nombre se importa dos veces :) – Llyle

+0

Ah, disculpa por eso, me perdí la etiqueta, y la pregunta no especificó. Tengo que admitir que cuando las soluciones de búsqueda y reemplazo comienzan a tomar más de media hora, generalmente me escribo una herramienta personalizada de búsqueda y reemplazo para manejar mi situación específica. Sin embargo, parece que alguien ya escribió la herramienta que necesita, por lo que solo tiene que decidir si desea pagarla;). – AHelps

4

Aquí hay una secuencia de comandos Powershell que he utilizado para lograr un cambio de nombre de espacio de nombres doloroso. En mi situación, había cerca de 5000 archivos fuente VB.Net y C# haciendo un uso intensivo de una biblioteca común (CSLA). Por razones que no vale la pena discutir, necesitaba cambiar el nombre del espacio de nombres Csla a CslaLegacy. Con un esfuerzo mínimo, debería ser capaz de adaptar este script a sus necesidades específicas. El script busca de forma recursiva el árbol de fuentes en busca de archivos .vb y .cs. La tabla hash $ repValues ​​contiene las cadenas que necesitan ser reemplazadas. Una variante de este script también se puede usar para actualizar las referencias del proyecto, en caso de que su cambio de nombre incluya un cambio en el nombre del ensamblado. Puede agregar una llamada a su herramienta de control de origen para verificar el archivo antes de la modificación. Originalmente hice esto para TFS, pero me pareció lento ejecutar tf.exe. Al final, fue mucho más rápido simplemente verificar todo el árbol fuente antes de ejecutar el script. Uso el editor de scripts PowerGUI para depurar y ejecutar scripts de 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

Otra razón para cambiar a c sharp. Refactorización del código fuente integrado de forma gratuita en VS 2008.

Cuestiones relacionadas