Las listas lo dificultan ... mi respuesta anterior (a continuación) solo se aplica a las propiedades similares (no a las listas). Sospecho que sólo podría tener que escribir y mantener código:
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
});
}
edición; solo se aplica a copias poco profundas - no a listas
La reflexión es una opción, pero lenta. En 3.5 puedes construir esto en un código compilado con Expression
. Jon Skeet tiene una muestra de pre-laminado de esto en MiscUtil - sólo tiene que utilizar como:
Student source = ...
StudentDTO item = PropertyCopy<StudentDTO>.CopyFrom(student);
Debido a que este utiliza un compilado Expression
será enormemente superar el rendimiento de reflexión.
Si no tiene 3.5, utilice reflection o ComponentModel. Si utiliza ComponentModel, al menos puede utilizar HyperDescriptor
conseguirlo casi tan rápido como 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));
}
Eche un vistazo a [Automapper] (http://automapper.org/). Esa herramienta fue diseñada para manejar este escenario exacto. – Steven