2010-08-11 10 views
13

Si alguien sabe más formas de hacerlo en .NET y también ¿cuál es su opinión sobre ese enfoque? ¿Qué enfoque eliges y por qué?Enfoques de copia de objeto en .net: Auto Mapper, Emit Mapper, Operación implícita, Copia de propiedad

Aquí están las pruebas de diferentes formas de copia de objetos en .NET.

pruebas relacionadas con este hilo original: How to copy value from class X to class Y with the same property name in c#?

lo tanto, aquí se trata, puede ejecutar por sí mismo:

static void Main(string[] args) 
    { 
     Student _student = new Student(); 
     _student.Id = 1; 
     _student.Name = "Timmmmmmmmaaaahhhh"; 
     _student.Courses = new List<int>(); 
     _student.Courses.Add(101); 
     _student.Courses.Add(121); 

     Stopwatch sw = new Stopwatch(); 

     Mapper.CreateMap<Student, StudentDTO>();    

     StartTest(sw, "Auto Mapper"); 

     for (int i = 0; i < 1000000; i++) 
     { 
      StudentDTO dto = Mapper.Map<Student, StudentDTO>(_student); 
     } 

     StopTest(sw); 

     StartTest(sw, "Implicit Operator"); 

     for (int i = 0; i < 1000000; i++) 
     { 
      StudentDTO itemT = _student; 
     } 

     StopTest(sw); 

     StartTest(sw, "Property Copy"); 

     for (int i = 0; i < 1000000; i++) 
     { 

      StudentDTO itemT = new StudentDTO 
      { 
       Id = _student.Id, 
       Name = _student.Name, 
      }; 

      itemT.Courses = new List<int>(); 
      foreach (var course in _student.Courses) 
      { 
       itemT.Courses.Add(course); 
      } 
     } 

     StopTest(sw); 

     StartTest(sw, "Emit Mapper"); 

     ObjectsMapper<Student, StudentDTO> emitMapper = ObjectMapperManager.DefaultInstance.GetMapper<Student, StudentDTO>(); 

     for (int i = 0; i < 1000000; i++) 
     { 
      StudentDTO itemT = emitMapper.Map(_student); 
     } 

     StopTest(sw); 
    } 

resultados de las Pruebas en mi PC:

Auto Test Mapper: 22322 ms

Prueba implícita Operador: 310 ms

Copia de prueba del inmueble: 250 ms

prueba Emitir Mapper: 281 ms

Usted puede conseguir emiten y -mappers automóviles desde aquí:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

+5

Eso es genial, pero ¿cuál es su pregunta? – Oded

+0

Sí, no veo el sentido de todo esto. Necesita un objetivo antes de poder decidir que necesita una copia (en lugar de usar el objeto original) y necesita un objetivo para elegir el enfoque correcto. Dicho esto, otra copiadora es MemberwiseClone(). – Qwertie

+0

¿Estás tratando de crear una copia del objeto para probar ... No entiendo la pregunta ... puedes usar mole en .net4 ... Mapper funcionaría mejor ... Pero aclara tu pregunta –

Respuesta

4

También es posible usar T4 para generar clases que generarán código de copia de propiedad.

bueno: corre tan rápido como es posible malo: "codificación" en la T4 feo: Hacer scripts de creación que le permiten compilar todo de una sola vez

+1

Para los que marcan spam, por favor deje de. Además, esta respuesta no es tan mala. – Will

+0

¿Conoces algún recurso para comenzar a utilizar T4 para crear este tipo de ayudantes de copia? –

1

has necesitado reemplazando el método Clone para copiar instancias de objetos? De esta manera, se obtiene un nuevo objeto estudiante como esto:

for (int i = 0; i < 1000000; i++) 
{ 
    StudentDTO itemT = _student.Clone(); 
} 

Me parece que este enfoque de la manera más fácil de copiar objetos en nuevos objetos, aunque no he hecho ningún test de velocidad para averiguar qué tan bien se lleva a cabo en contra los métodos que sugieres

1

el clon es para copiar el mismo Tipo no para copiar de 2 objetos diferentes El tipo no se puede usar para este ámbito.

Cuestiones relacionadas