2009-08-04 12 views
31

Sto cercando un modo per accelerare un'attività ripetibile quando scrivo codice. Ho ReSharper e sto pensando che una personalizzazione possa fare ciò di cui ho bisogno.ReSharper può generare codice che copia le proprietà da un oggetto a un altro?

Ho due oggetti dello stesso tipo. Voglio copiare tutte le proprietà pubbliche di un oggetto sull'altro oggetto. Voglio che lo strumento, ReSharper in questo caso, faccia generare il codice per me. Gli dirò i nomi del primo oggetto e del secondo oggetto. Voglio che trovi tutte le proprietà pubbliche del primo oggetto e copi i valori nel secondo oggetto.

Ecco il tipo di codice che sto cercando di avere generato con uno strumento come ReSharper:

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

Automatizzare questo semplice codice che copia i valori da destra a sinistra farebbe risparmiare un sacco di tempo e io sono pensando che ReSharper possa farlo. Tuttavia, non ho visto nulla di pop-up nelle ricerche per questo però.

Non sto cercando una tecnica di generazione del codice CodeSmith o modello T4 perché voglio solo generare queste righe specifiche all'interno della mia classe, non generare e l'intera classe o un file separato.

Qualcuno conosce un modo per premere alcune sequenze di tasti, immettere i nomi degli oggetti "foo" e "moo" sopra e lo strumento generare queste copie dalle righe di codice destra a sinistra?

Aggiornamento:

ho trovato un po 'di documentazione su ampliamento di edifici a ReSharper, e questo può probabilmente essere raggiunto da questa strada, ma sembra davvero coinvolto.

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

questo sta cominciando a sembrare una sfida fine settimana a meno che qualcun altro ha già scritto.

risposta

8

Non credo che Resharper possa farlo, ma Open Source AutoMapper can. Nuovo su AutoMapper? Controlla la pagina Getting Started.

+0

non avevo mai sentito parlare di questo strumento. Con livelli di accesso ai dati e Contratti dati che rendono questo tipo di codice una necessità, questo è un ottimo strumento! – Vaccano

+2

Automapper è sicuramente una grande cosa per alcuni casi, ma può essere MOLTO lento per grandi quantità di oggetti. – Telavian

+7

Abbiamo usato Automapper in una grande app aziendale con una tonnellata di DTO e dopo 6 mesi l'abbiamo abbandonato perché era più difficile da mantenere e eseguire il debug rispetto al semplice vecchio compito delle proprietà. Non dovrebbe essere considerato un grande successo contro AM, ma alla fine volevamo solo rompere su una riga di codice invece di leggere un grande messaggio di errore (il messaggio di errore era preciso e utile). – TheDev6

-2

La semplice copia dei valori da un lato all'altro è piuttosto brutta.

È possibile che sia preferibile creare un metodo da includere nelle classi che utilizza la riflessione per copiare le proprietà pubbliche. È possibile salvare questo metodo nel resharper per rigenerare in altre classi in cui è necessaria questa funzionalità.

1

Ecco una semplice classe per clonare un oggetto. Non è esattamente quello che hai chiesto, ma forse questo sarà utile per voi:

//.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

Questo è il tipo di cosa per la quale Cog brilla. Fondamentalmente, Cog è uno strumento per la generazione del codice. Il codice viene generato tramite Python.

+6

Quindi, il tuo suggerire la risposta alla mia domanda è usare un programma Python per aiutarmi a scrivere il mio codice C#? Hai un esempio di questo? – a7drew

4

Sono d'accordo con @ Ben Griswold.
Nella maggior parte dei casi, Automapper è la soluzione giusta.

Ma quando veramente si vuole generare il codice che copia oggetti di un oggetto all'altro, provare questo:

  1. creare una nuova classe marchio e derivano dalla classe da cui si desidera copiare le proprietà.
  2. Fare clic con il tasto destro del mouse su questa nuova classe derivata e fare clic su "Refactor> Estrai interfaccia".
  3. Controllare tutte le proprietà che si desidera copiare.
  4. Scegli "Posiziona accanto" perché questa interfaccia sarà solo temporanea.
  5. Fare clic su "Avanti".
  6. Modificare la classe derivata in modo che non si erediti più dalla classe base e si stia implementando solo la nuova interfaccia. Aspettatevi di vedere un ghirigoro rosso.
  7. Posiziona il cursore sopra il ghirigoro rosso e premi "ALT-ENTER" su "Implementa membri".
  8. Fare clic su "Fine".
  9. Elimina quell'interfaccia temporanea e modifica la classe in modo che non la si stia più implementando.
43

È davvero facile. ReSharper non lo fa, ma puoi usare un REGEX super duper!

In Visual Studio:

public string Email { get; set; } 
    public string CellPhone { get; set; } 
    public int NumChildren { get; set; } 
    public DateTime BirthDate { get; set; } 
  1. selezionare tutte le proprietà. Hit CTRL-D da copiare.

  2. Ora premere CTRL-H da sostituire. Assicurati che .* sia selezionato per la corrispondenza Regex.

  3. Sostituire: public [\w?]* (\w*) .* (Questo Regex può avere bisogno di essere ottimizzato)

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

Ora avete qualche bella codice si può mettere in un metodo della tua scelta:

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

Consentitemi di collegare anche * AutoMapper *. È davvero abbastanza facile copiare le proprietà con esso. Dipende dalla tua situazione, naturalmente. – Jess

8

Questo è un po 'derivato dalla risposta di @Jess (la sua regex non ha funzionato per me su VS2013) ma invece di usare Visual Studio I am using regex101

Fare clic sul collegamento sopra e incollare le proprietà nel campo Test string e le si otterrà mappato.

Regex ho usato

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

e sostituire

Dest.$1 = Source.$1

speranza questo consente di risparmiare un po 'di tempo.

+0

Ciao Matas. Sì, ho permesso i tipi nullable e ho rotto la regex nella mia risposta. Ora è riparato. Grazie. – Jess

1

In base alla risposta @Matas ho creato una versione più robusta using regex101 che ignora generici, attributi e commenti e normalizza gli spazi.

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

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

Problemi correlati