Подходы к копированию объектов в.net: Auto Mapper, Emit Mapper, неявная операция, копирование свойств

Если кто-то знает больше способов сделать это в.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);
    }

Результаты тестов на моем ПК:

Тест Авто картограф:22322 мс

Тест неявного оператора:310 мс

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

Тест Emit Mapper:281 мс

Вы можете получить Emit и Auto -Mapper здесь:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

3 ответа

Решение

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

Хорошо: работает так быстро, как это возможно. Плохо: "кодирование" в T4 Уродливо: создание сценариев сборки, позволяющих скомпилировать все за один раз

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

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

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

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

Другие вопросы по тегам