Вы можете предварительно привлекать имена свойств, которые вас интересуют (т.е. те, которые с атрибутом описания), а затем использовать их, чтобы получить только интересы, которые вас интересуют.
Я взломал быстрый пример этого, это не самый надежный код, но он показывает общую идею (делает много предположений о упорядочении) и только один раз принес атрибуты.
(РЕДАКТИРОВАТЬ: Понятно, что нам нужно позвонить в GetProperties только один раз для всего).
var whitelist = typeof (DocumentTrackerChaseReport)
.GetProperties()
.Where(x => Attribute.IsDefined(x, typeof (DescriptionAttribute)));
var rows = things.Select(x => whitelist.Select(y => y.GetValue(x) ?? ""));
Это даст вам IEnumerable<IEnumerable<object>>
, или, другими словами, список строк и для каждой строки, список столбцов (со значением каждого столбца является объектом).
Затем вы можете перевернуть это следующим образом (псевдо -код)
foreach (var header in whitelist) {
// print column of header row
}
foreach (var row in rows) {
foreach (var col in row) {
// print an individual cell
}
// break for a new row
}