2009-08-04 12 views
31

Estoy buscando una forma de acelerar una tarea repetible cuando escribo código. Tengo ReSharper y estoy pensando que una personalización podría hacer lo que necesito.¿Puede ReSharper generar código que copie propiedades de un objeto a otro?

Tengo dos objetos del mismo tipo. Quiero copiar todas las propiedades públicas de un objeto al otro objeto. Quiero que la herramienta, ReSharper en este caso, genere el código para mí. Le diré los nombres del primer objeto y el segundo. Quiero que encuentre todas las propiedades públicas del primer objeto y copie los valores al segundo objeto.

Aquí es el tipo de código que estoy mirando haber generado con una herramienta como ReSharper:

foo.Name = moo.Name; 
foo.Age = moo.Age; 
foo.City = moo.City; 

La automatización de este código simple que copia valores de derecha a izquierda se ahorraría un montón de tiempo y estoy pensando que ReSharper puede hacerlo. Sin embargo, no he visto nada emergente en las búsquedas.

No estoy buscando una técnica de generación de código CodeSmith o una plantilla T4 porque solo quiero que genere estas líneas específicas dentro de mi clase, no genere una clase completa o un archivo separado.

¿Alguien sabe cómo presionar algunas teclas, ingrese los nombres de los objetos "foo" y "moo" y la herramienta genera estas copias de derecha a izquierda?

Actualización:

que he encontrado alguna documentación de ampliación de edificios a ReSharper, y esto probablemente se puede lograr mediante ese camino, pero se ve muy involucrado.

http://www.jetbrains.net/confluence/display/ReSharper/PowerToys+Pack+3.0+User+Guide

esto está empezando a parecerse a un desafío de fin de semana a menos que alguien ya lo ha escrito.

Respuesta

8

No creo que Resharper pueda hacer esto, pero Open Source AutoMapper puede. ¿Nuevo en AutoMapper? Consulte la página Getting Started.

+0

que nunca había oído hablar de esta herramienta. Con capas de acceso a datos y contratos de datos que hacen que este tipo de código sea una necesidad, ¡esta es una gran herramienta! – Vaccano

+2

Automapper es definitivamente una gran cosa para algunos casos, pero puede ser MUY lenta para grandes cantidades de objetos. – Telavian

+7

Utilizamos Automapper en una gran aplicación para empresas con una tonelada de DTO y después de 6 meses la abandonamos porque era más difícil de mantener y depurar que la antigua asignación simple de las propiedades. No debería considerarse un gran éxito contra AM, pero al final solo queríamos romper una línea de código en lugar de leer un gran mensaje de error (el mensaje de error era preciso y útil). – TheDev6

-2

Simplemente copiar los valores de un lado al otro es bastante feo.

Puede que sea mejor crear un método para incluir en sus clases que utilice la reflexión para copiar las propiedades públicas. Puede guardar este método en resharper para regenerar en otras clases en las que necesita esta funcionalidad.

1

Aquí hay una clase simple para clonar un objeto. No es exactamente lo que usted pidió, pero tal vez esto va a ser útil para Usted:

//.Net 2.0 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Text; 

namespace YourNameSpace { 
    public static class ObjectCloner { 
     public static T Clone<T>(T obj) { 
     using (MemoryStream buffer = new MemoryStream()) { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(buffer, obj); 
      buffer.Position = 0; 
      T temp = (T)formatter.Deserialize(buffer); 
      return temp; 
     } 
     } 
    } 
} 
-1

Este es el tipo de cosa para la que brilla Cog. Básicamente, Cog es una herramienta de generación de código. El código se genera a través de Python.

+6

¿Entonces, sugerir la respuesta a mi pregunta es usar un programa Python para ayudarme a escribir mi código C#? ¿Tienes un ejemplo de esto? – a7drew

4

Estoy de acuerdo con @Ben Griswold.
En la mayoría de las situaciones, Automapper es el camino a seguir.

Pero cuando realmente desea generar código que copia las propiedades de un objeto a otro, intente esto:

  1. crear una nueva clase de marca y derivados de la clase de la que desea copiar las propiedades.
  2. Haz clic derecho en esta nueva clase derivada y haz clic en 'Refactorizar> Extraer interfaz'.
  3. Marque todas las propiedades que desea copiar.
  4. Elija 'Colocar al lado' porque esta interfaz será solo temporal.
  5. Haga clic en 'Siguiente'.
  6. Modifique su clase derivada para que ya no herede de la clase base y solo está implementando su nueva interfaz. Espera ver un garabato rojo.
  7. Coloque el cursor sobre el garabato rojo y pulse 'ALT-ENTER' para 'Implementar miembros'.
  8. Haga clic en 'Finalizar'.
  9. Borre esa interfaz temporal y modifique su clase para que ya no la implemente.
43

Es realmente fácil. ¡ReSharper no lo hace, pero puedes usar un super duper REGEX!

En Visual Studio:

public string Email { get; set; } 
    public string CellPhone { get; set; } 
    public int NumChildren { get; set; } 
    public DateTime BirthDate { get; set; } 
  1. Seleccionar todos sus propiedades. Pulse CTRL-D para copiar.

  2. Ahora pulse CTRL-H para reemplazar. Asegúrese de que .* esté seleccionado para la coincidencia de Regex.

  3. Reemplazar: public [\w?]* (\w*) .* (Esta expresión regular puede necesitar ser ajustado)

  4. Con: dest.$1 = source.$1;

Ahora usted tiene algún código bellas que se pueden poner en un método de su elección:

dest.Email = source.Email; 
    dest.CellPhone = source.CellPhone; 
    dest.NumChildren = source.NumChildren; 
    dest.BirthDate = source.BirthDate; 
+0

Permitirme conectar * AutoMapper * también. Es muy fácil copiar propiedades con él. Depende de tu situación, por supuesto. – Jess

8

Esto es algo derivado de la respuesta de @Jess (su expresión regular no funcionó para mí en VS2013) pero en lugar de usar Visual Studio Soy using regex101

Haga clic en el enlace de arriba y simplemente pegue sus propiedades en el campo Test string y las obtendrá mapeadas.

expresión regular que utiliza

public [A-Za-z\?]* ([A-Za-z0-9]*) .*

y reemplazar

Dest.$1 = Source.$1

esperanza esto le ahorra tiempo.

+0

Hola Matas. Sí, permití tipos de nullable y rompí la expresión regular en mi respuesta. Ahora está arreglado. Gracias. – Jess

1

Basado en @Matas respuesta Creé una versión más robusta using regex101 que ignora los genéricos, atributos y comentarios y normaliza los espacios.

Regex: *((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*) .*(\n|)*

Reemplazar: $4 = person.$4,\n

Cuestiones relacionadas