Подходы к копированию объектов in.net: автоматический Mapper, испускает Mapper, неявную деятельность, экземпляр свойства
Если кто-то знает больше способов сделать это в .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);
}
результаты тестов на my PC:
тестовый автоматический картограф: 22322 ms
тестовый неявный оператор: 310 МС
копия свойства теста: 250 мс
тест испускает картограф:281 МС
вы можете получить emit и auto-mappers отсюда:
3 ответов
также можно использовать T4 для создания классов, которые будут генерировать код копирования свойств.
хорошо: работает так быстро, как это возможно Плохо: "кодирование" в T4 Ugly: создание скриптов сборки, которые позволяют скомпилировать все это за один раз
вы пытались переопределить метод clone для копирования экземпляров объекта? Таким образом, вы получаете новый объект student следующим образом:
for (int i = 0; i < 1000000; i++)
{
StudentDTO itemT = _student.Clone();
}
Я нахожу этот подход самым простым способом копирования объектов в новые объекты, хотя я не делал никаких тестов скорости, чтобы узнать, насколько хорошо он работает против методов, которые вы предлагаете.
клон предназначен для копирования одного и того же типа, а не для копирования из 2 разных типов объектов, которые не могут использоваться для этой области.