Объектная копия подходов в .NET: Auto Mapper, Emit Mapper, неявная работа, копирование свойств

StackOverflow https://stackoverflow.com/questions/3457657

Вопрос

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

Испытания результаты на моем ПК:

Тест Авто Mapper: 22322 мс

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

Испытательное свойство Копия: 250 мс

Тест Emit Mapper: 281 мс

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

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top