2010-11-10 11 views
7

ho scritto una funzione che copia le proprietà di una classe ad un altro in modo da fare una copia di un oggetto..NET: C'è una classe di copiare le proprietà di una classe all'altra

Quindi qualcosa di simile

MyObject myObject = myOtherObject.MyCustomCopy(myObject) 

dove myObject e myOtherObject sono dello stesso tipo. Io lo faccio da bascually facendo

myObject.prop1 = myOtherObject.prop1 
myObject.prop2 = myOtherObject.prop2 
myObject.prop3 = myOtherObject.prop3 
return myObject 

Sono abbastanza sicuro che in passato ho usato un oggetto .NET che automaticamente ha fatto questo, per riflesso immagino, ma non riesco a ricordare ... o un immaginando io che esiste un tale metodo?

Sì, sono a conoscenza del mapper auto, ma ero sicuro (non tanto ora) che c'è un oggetto .NET che fa il lavoro. Forse no!

risposta

9

Si può dare un'occhiata a AutoMapper.

+0

dovuto controllare i timestamp per questo uno :) –

5

Si dovrebbe usare AutoMapper è stata costruita per questo lavoro.

+0

La domanda è: come fare una copia di un oggetto, non come copiare i valori delle proprietà di un oggetto a un oggetto di tipo diverso. – Sisyphus

+0

Puoi anche clonare gli oggetti in questo modo. –

1

Questo codice dovrebbe funzionare per i tipi di proprietà di base, non so come si andrà per nulla complessi (liste, array, classi personalizzate). Dovrebbe essere un punto di partenza però:

public class MyClass 
{ 
    public int A { get; set; } 
    public string B { get; set; } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    MyClass orig = new MyClass() { A = 1, B = "hello" }; 
    MyClass copy = new MyClass(); 

    PropertyInfo[] infos = typeof(MyClass).GetProperties(); 
    foreach (PropertyInfo info in infos) 
    { 
    info.SetValue(copy, info.GetValue(orig, null), null); 
    } 
    Console.WriteLine(copy.A + ", " + copy.B); 
} 
4
public static class ext 
{ 
    public static void CopyAllTo<T>(this T source, T target) 
    { 
     var type = typeof(T); 
     foreach (var sourceProperty in type.GetProperties()) 
     { 
      var targetProperty = type.GetProperty(sourceProperty.Name); 
      targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null); 
     } 
     foreach (var sourceField in type.GetFields()) 
     { 
      var targetField = type.GetField(sourceField.Name); 
      targetField.SetValue(target, sourceField.GetValue(source)); 
     } 
    } 
} 
+0

AutoMapper menzionato sopra è molto più potente, ma per casi di utilizzo semplici come il mio, questo è molto più semplice e veloce da utilizzare. Grazie! –

0

In termini molto semplici: Come sappiamo classi sono tipi di riferimento in C# .NET cioè quando si crea un oggetto di una classe, come

Customer C1=new Customer(); 
C1.Id=1; 
C1.Name="Rakesh"; 

Quindi C1 (variabile di riferimento) viene memorizzata nello stack di memoria e l'oggetto nuovo Cliente() viene memorizzato su Heap.

Pertanto, quando copiamo una classe in un'altra classe che è fondamentalmente la tua domanda si può fare qualcosa di simile di seguito:

Customer C2=C1; 

Facendo sopra copierà la variabile C1 di riferimento in C2 Ma perché ho scritto su stack e heap perché l'utilizzo variabile di riferimento C2 è possibile modificare le proprietà degli oggetti essendo sia C1 e C2 indicando stesso oggetto in HEAP.Something Come

C2.Id=1; 
C2.Name="Mukesh"; 

Ora, se si tenta di accedere a C1.Name si vedrà che è cambiato in "Mukesh" .

Problemi correlati