Puede precisar los nombres de las propiedades que le interesan (es decir, las que tienen el atributo de descripción) y luego usarlos para obtener solo los valores que le interesan.
He pirateado un ejemplo rápido de esto, no es el código más robusto, pero muestra la idea general (hace muchas suposiciones sobre el pedido) y solo obtuve los atributos una vez.
(Editar: Me di cuenta de que solo necesitábamos llamar a GetProperties una vez para todo).
var whitelist = typeof (DocumentTrackerChaseReport)
.GetProperties()
.Where(x => Attribute.IsDefined(x, typeof (DescriptionAttribute)));
var rows = things.Select(x => whitelist.Select(y => y.GetValue(x) ?? ""));
Esto te dará un IEnumerable<IEnumerable<object>>
, o en otras palabras, una lista de filas y para cada fila, una lista de columnas (con el valor de cada columna como un objeto).
Luego podría iterar a través de esto de la siguiente manera (pseudo código)
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
}