2010-11-10 22 views
7

Escribí una función que copia las propiedades de una clase a otra, así que haga una copia de un objeto..NET: ¿Hay una clase para copiar propiedades de una clase a otra?

así que algo como

MyObject myObject = myOtherObject.MyCustomCopy(myObject) 

donde myObject y myOtherObject son del mismo tipo. Lo hago por bascually haciendo

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

Estoy bastante seguro de que en el pasado he usado un objeto .NET que hizo esto de forma automática, por la reflexión, supongo, pero no lo recuerdo ... o una imaginación que yo tal método existe?

Sí, soy consciente de auto mapper pero estaba seguro (no tanto ahora) de que hay un objeto .NET que hace el trabajo. ¡Tal vez no!

Respuesta

9

Usted puede echar un vistazo a AutoMapper.

+0

Tuve que comprobar las marcas de tiempo para esta :) –

5

Debe usar AutoMapper fue diseñado para este trabajo.

+0

La pregunta es cómo hacer una copia de un objeto, no cómo copiar los valores de propiedad de un objeto a un objeto de tipo diferente. – Sisyphus

+0

También puede clonar objetos de esta manera. –

1

Este código debe trabajar para los tipos básicos de propiedad, sin saber cómo va a ir para nada compleja (listas, arrays, clases personalizadas). En caso de ser un punto de partida sin embargo:

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 mencionado anteriormente es mucho más potente, pero para casos de uso simple como el mío, es mucho más simple y más rápido ejecutarlo. ¡Gracias! –

0

En términos muy simples: Como sabemos clases son tipos de referencia en C es decir # .NET cuando creamos un objeto de una clase como

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

Luego C1 (variable de referencia) se almacena en la pila de memoria y el objeto nuevo Cliente() se almacena en Heap.

De ahí que cuando se copia una clase a otra clase que es básicamente su pregunta se puede hacer algo, como a continuación:

Customer C2=C1; 

Haciendo anterior copiará la variable C1 de referencia en C2 Pero por qué escribí sobre Stack y Heap porque el uso de la variable de referencia C2 puede cambiar las propiedades del objeto siendo ambos C1 y C2 que apunta a un mismo objeto en HEAP.Something Como

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

Ahora si va a intentar el acceso C1.Name verá que se cambia a "Mukesh" .

Cuestiones relacionadas