Cópia de objeto se aproxima no .net: mapeador automático, mapeador emit, operação implícita, cópia de propriedade

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

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:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top