2010-08-11 2 views
13

Если кто-то знает больше способов сделать это в .NET, а также каково ваше мнение об этом? Какой подход вы выбираете и почему?Подходы копирования объектов в .net: Auto Mapper, Emit Mapper, Implicit Operation, Property Copy

Вот тесты различных способов копирования объектов в .NET.

тесты, относящиеся к этой оригинальной теме: How to copy value from class X to class Y with the same property name in c#?

Итак, вот оно, вы можете запустить его самостоятельно:

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); 
    } 

Результаты испытаний на моем компьютере:

Test Auto Mapper: 22322 мс

Испытание Неявный оператор: 310 мс

Test Copy Property: 250 мс

Тест Испустите Mapper: 281 мс

Вы можете получить испускают и авто -mappers здесь:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

+5

Это замечательно, но в чем вопрос? – Oded

+0

Да, я не вижу смысла в этом. Вам нужна цель, прежде чем вы даже сможете решить, что вам нужна копия (вместо использования исходного объекта), и вам нужна цель, чтобы выбрать правильный подход. Тем не менее, другим копиром является MemberwiseClone(). – Qwertie

+0

Вы пытаетесь создать копию объекта для тестирования. Я не понимаю вопроса ... вы можете использовать mole в .net4 ... Mapper работал бы лучше. Но, пожалуйста, уточните свой вопрос. –

ответ

4

Также возможно использовать T4 для генерации классов, которые будут генерировать код копирования свойств.

Хорошо: работает так же быстро, как это возможно Bad: «кодирование» в Т4 Гадкий: Создание сценариев сборки, которые позволяют собрать все это в один идти

+1

. Для пишущих спама, пожалуйста остановись. Кроме того, этот ответ не является плохим. – Will

+0

Знаете ли вы о каких-либо ресурсах, чтобы начать работу с T4, чтобы придумать этот тип помощников для копирования? –

1

Вы пробовали перекрывая метод Clone для копирования экземпляры объектов? Таким образом, вы получите новый объект студент, как это:

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

Я считаю этот подход самый простой способ копирования объектов в новые объекты, хотя я не сделал каких-либо тестов скорости, чтобы выяснить, насколько хорошо он выполняет против методы, которые вы предлагаете.

1

Клон предназначен для копирования того же типа, что и для копирования из двух разных объектов. Тип не может использоваться для этой области.

Смежные вопросы