Les listes rendent difficile ... ma réponse précédente (ci-dessous) ne s'applique qu'aux propriétés similaires (pas aux listes). Je suppose que vous pourriez avoir juste besoin d'écrire et de maintenir le code:
Student foo = new Student {
Id = 1,
Name = "a",
Courses = {
new Course { Key = 2},
new Course { Key = 3},
}
};
StudentDTO dto = new StudentDTO {
Id = foo.Id,
Name = foo.Name,
};
foreach (var course in foo.Courses) {
dto.Courses.Add(new CourseDTO {
Key = course.Key
});
}
modifier; s'applique uniquement à peu profond copies - listes non
La réflexion est une option, mais lente. En 3.5, vous pouvez construire ceci dans un bit de code compilé avec Expression
. Jon Skeet a un échantillon pré-roulé de cela dans MiscUtil - il suffit d'utiliser comme:
Student source = ...
StudentDTO item = PropertyCopy<StudentDTO>.CopyFrom(student);
Parce que celui-ci utilise un langage compilé Expression
il surclasser largement la réflexion.
Si vous n'avez pas 3.5, utilisez la réflexion ou ComponentModel. Si vous utilisez ComponentModel, vous pouvez au moins utiliser HyperDescriptor
pour l'obtenir près aussi rapide que Expression
Student source = ...
StudentDTO item = new StudentDTO();
PropertyDescriptorCollection
sourceProps = TypeDescriptor.GetProperties(student),
destProps = TypeDescriptor.GetProperties(item),
foreach(PropertyDescriptor prop in sourceProps) {
PropertyDescriptor destProp = destProps[prop.Name];
if(destProp != null) destProp.SetValue(item, prop.GetValue(student));
}
Jetez un oeil à [Automapper] (http://automapper.org/). Cet outil a été conçu pour gérer ce scénario exact. – Steven