Cópia de objeto se aproxima no .net: mapeador automático, mapeador emit, operação implícita, cópia de propriedade
-
27-09-2019 - |
Pergunta
Se alguém sabe mais maneiras de fazer isso no .NET e também qual é a sua opinião sobre isso se aproxima? Qual abordagem você escolhe e por quê?
Aqui estão os testes de diferentes maneiras de cópia do objeto no .net.
Testes relacionados a este tópico original: Como copiar o valor da classe X para a classe Y com o mesmo nome de propriedade em C#?
Então, aqui está, você pode executá -lo mesmo:
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);
}
Testes Resultados no meu PC:
Teste Mapper automático: 22322 ms
Teste Operador implícito: 310 ms
Cópia da propriedade de teste: 250 ms
Teste Emit Mapper: 281 ms
Você pode ser emitido e auto -mapeadores daqui:
Solução
Também é possível usar o T4 para gerar classes que gerarão código de cópia da propriedade.
Bom: funciona o mais rápido possível: "codificação" em T4 Ugly: Fazendo scripts de construção que permitem compilar tudo de uma só vez
Outras dicas
Você já tentou substituir o método clone para copiar instâncias de objeto? Dessa forma, você obtém um novo objeto estudantil como este:
for (int i = 0; i < 1000000; i++)
{
StudentDTO itemT = _student.Clone();
}
Acho essa abordagem a maneira mais fácil de copiar objetos em novos objetos, embora eu não tenha feito nenhum teste de velocidade para descobrir o desempenho dos métodos que você sugere.
O clone é para copiar o mesmo tipo não para copiar de 2 objetos diferentes, e não pode ser usado para esse escopo.