Объектная копия подходов в .NET: Auto Mapper, Emit Mapper, неявная работа, копирование свойств
-
27-09-2019 - |
Вопрос
Если кто-то знает больше способов сделать это в .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 отсюда:
Решение
Также возможно использовать T4 для генерации классов, которые будут генерировать код копирования свойств.
Хорошо: работает так быстро, как можно плохо: «кодирование» в T4 уродливой: создание сценариев сборки, которые позволяют компилировать все в одном
Другие советы
Вы пытались переопределить метод клона для копирования объектных экземпляров? Таким образом, вы получаете новый студенческий объект, как это:
for (int i = 0; i < 1000000; i++)
{
StudentDTO itemT = _student.Clone();
}
Я нахожу этот подход самым простым способом копирования объектов в новые объекты, хотя я не сделал никаких испытаний скорости, чтобы выяснить, насколько хорошо он выполняет методы, которые вы предлагаете.
Клон предназначен для копирования того же типа, а не для копирования с 2 различных типов объектов, то нельзя использовать для этой области.