Sie können die Namen der Eigenschaften, an denen Sie interessiert sind, vorbauen (dh diejenigen mit dem Beschreibungattribut) und dann diese verwenden, um nur die Werte zu greifen, an denen Sie interessiert sind.
Ich habe ein kurzes Beispiel dafür gehackt, es ist nicht der robusteste Code, aber es zeigt die allgemeine Idee (macht viele Annahmen über die Bestellung) und hat die Attribute nur einmal abgerufen.
(Bearbeiten: Erkannt, dass wir nur einmal GetProperties für alles anrufen mussten).
var whitelist = typeof (DocumentTrackerChaseReport)
.GetProperties()
.Where(x => Attribute.IsDefined(x, typeof (DescriptionAttribute)));
var rows = things.Select(x => whitelist.Select(y => y.GetValue(x) ?? ""));
Dies gibt Ihnen eine IEnumerable<IEnumerable<object>>
, oder mit anderen Worten eine Liste von Zeilen und für jede Zeile eine Liste von Spalten (wobei der Wert jeder Spalte ein Objekt ist).
Sie können dies dann wie folgt durchsetzen (Pseudocode)
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
}