Подходы к копированию объектов в .net: Auto Mapper, Emit Mapper, Implicit Operation, Property Copy

Если кто-то знает другие способы сделать это в .NET, а также каково ваше мнение об этих подходах? Какой подход вы выберете и почему?

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

Тесты, относящиеся к этой исходной теме: Как скопировать значение из класса X в класс Y с тем же именем свойства в 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 мс

Копия тестового свойства: 250 мс

Картограф тестового излучения: 281 мс

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

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/


person angularrocks.com    schedule 11.08.2010    source источник
comment
Это здорово, но в чем ваш вопрос?   -  person Oded    schedule 11.08.2010
comment
Да, я не вижу во всем этом смысла. Вам нужна цель, прежде чем вы даже сможете решить, что вам нужна копия (вместо использования исходного объекта), и вам нужна цель, чтобы выбрать правильный подход. Тем не менее, еще один копировальный аппарат - MemberwiseClone ().   -  person Qwertie    schedule 10.11.2010
comment
Вы пытаетесь создать копию объекта для тестирования ... Я не понимаю вопроса ... вы можете использовать мол в .net4 ... Mapper будет работать лучше всего ... Но, пожалуйста, поясните свой вопрос   -  person WingMan20-10    schedule 12.11.2010


Ответы (3)


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

Хорошо: работает настолько быстро, насколько это возможно Плохо: «кодирование» в T4 Ugly: Создание сценариев сборки, которые позволят вам скомпилировать все за один раз

person Ivan Zivkovic    schedule 02.11.2010
comment
Для отметителей спама, пожалуйста, остановитесь. Кроме того, это неплохой ответ. - person ; 17.11.2010
comment
Знаете ли вы какие-либо ресурсы, чтобы начать работу с T4, чтобы придумать этот тип помощников по копированию? - person Shreedhar Kotekar; 21.03.2012

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

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

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

person Jazza    schedule 08.11.2010

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

person Giuseppe    schedule 20.06.2013