Списки усложняют ... Мой предыдущий ответ (ниже) относится только к подобным свойствам (но не к спискам). Я подозреваю, что вам, возможно, просто нужно написать и поддерживать код:
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
});
}
редактировать; применяется только к мелким копиям - не спискам
Отражение - вариант, но медленный. В 3.5 вы можете встроить это в скомпилированный фрагмент кода с Expression
. У Джона Скита есть предварительно свернутый образец этого в MiscUtil - просто используйте как:
Student source = ...
StudentDTO item = PropertyCopy<StudentDTO>.CopyFrom(student);
Поскольку он использует скомпилированный Expression
, он значительно превзойдёт отражение.
Если у вас нет 3.5, используйте отражение или ComponentModel. Если вы используете ComponentModel, вы можете по крайней мере использовать HyperDescriptor
, чтобы получить почти так быстро, как 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));
}