Pergunta

Eu escrevi uma classe com um método estático único que copia os valores de propriedade de um objeto para outro. Ele não se importa que tipo cada objeto é, só que eles têm propriedades idênticas. Ele faz o que eu preciso, então eu não estou projetando-lo ainda mais, mas o que melhorias você faria?

Aqui está o código:

public class ShallowCopy
{
    public static void Copy<From, To>(From from, To to)
        where To : class
        where From : class
    {
        Type toType = to.GetType();
        foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
        {
            toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null);
        }
    }
}

Eu estou usando-o como segue:

EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
Foi útil?

Solução

Os seus DTOs serializado? Eu esperaria por isso, caso em que:

MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From));
object[] data = FormatterServices.GetObjectData(from, sm);
FormatterServices.PopulateObjectMembers(to, sm, data);

Mas nota que eu realmente não concordo com esta abordagem geral. Eu preferiria um contrato forte para copiar em suas DTOs que cada implementos DTO.

Outras dicas

  • Alterar os nomes de parâmetro de tipo para dar cumprimento às convenções de nomenclatura, por exemplo, Tfrom e TTo, ou TSource e TDest (ou TDestination).

  • Do maior parte de seu trabalho em um tipo genérico em vez de em apenas um método genérico. Que permite armazenar em cache as propriedades, bem como permitindo a inferência de tipos. Inferência de tipos é importante no parâmetro "tfrom", uma vez que irá permitir que tipos anônimos para ser usado.

  • Você poderia torná-lo extremamente rápido, gerando dinamicamente código para fazer a cópia de propriedade e mantê-lo em um delegado que é válido para o "de" tipo. Ou potencialmente gerar para cada de / para o par, o que significaria a cópia real não seria necessário usar a reflexão em tudo! (Preparando o código seria um sucesso de uma só vez por par de tipos, mas espero que você não tem muitos pares.)

Um novo método que criou uma nova instância do To e chamou o método Copy() antes de voltar pode ser útil.

Como esta:

public static To Create<From, To>(From from)
    where To : class, new()
    where From : class
{
    var to = new To();
    Copy(from, to);
    return to;
}

Decida o que você quer fazer se passou objetos de tipos que partilham algumas propriedades, mas não todos. Verificar a existência da propriedade no objeto From no objeto To antes de tentar configurá-lo de valor. Fazer a "coisa certa" quando você vem para uma propriedade que não existe. Se todas as propriedades públicas precisam ser idênticos, então você precisa verificar se você configurou todos eles no objeto To e lidar com o caso onde você não tem de forma adequada.

Eu também sugerem que você pode querer usar atributos para decorar as propriedades que precisam ser copiados e ignorar outros. Isso permitirá que você para ir e voltar entre os dois objetos diferentes com mais facilidade e continuar a manter algumas propriedades públicas que são derivados em vez de armazenados no objeto de negócios.

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