يمكنك مسبقًا الأسماء الخاصة بالخصائص التي تهتم بها (أي تلك التي تحتوي على سمة الوصف) ثم استخدمها للاستيلاء على القيم التي تهتم بها فقط.
لقد اخترقت معًا مثالاً سريعًا على ذلك ، فهو ليس رمزًا أقوى ولكنه يظهر الفكرة العامة (يقدم الكثير من الافتراضات حول الطلب) ولم يحضر سوى السمات مرة واحدة.
(تحرير: أدركنا أننا بحاجة فقط للاتصال بـ 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
}