سؤال

أنا أستخدم .NET 4.0 ، C# 4.0 في Visual Studio 2012 مع Code First و Entity Framework.

لدي مجموعة من الفصول التي أريد استخدامها كأساس لتقرير مختلف. يتم عقد بيانات التقارير في قاعدة بيانات SQL. مثال على ذلك:

public class DocumentTrackerChaseReport
{
    public int DocumentTrackerChaseReportID { get; set; }
    public int CaseID { get; set; }
    public int DocumentID { get; set; }

    [Description("Case ID")]
    public String CaseIdentifier { get; set; }
    [Description("Document type")]
    public String DocumentCategory { get; set; }
    [Description("Contact")]
    public String ContactName { get; set; }
    [Description("Phone number")]
    public String ContactPhoneNumber { get; set; }
    [Description("email address")]
    public String ContactEmail { get; set; }

    public TrackingActionType TrackingActionType { get; set; }
}

تعمل سمات الوصف على حد سواء كرؤوس للتقرير وأيضًا للإشارة إلى الخصائص التي سيتم استبعادها من التقرير.

لدي طريقة لاستخراج الرؤوس كصفيف سلسلة من هذه سؤال

يمكنني أيضًا إنشاء طريقة تتحقق لمعرفة ما إذا كان للحقل/خاصية سمة وصف.

المكون الرئيسي الذي أفتقده هو وسيلة واضحة وعامة لإنشاء كل سطر من التقرير يحذف الحقول التي لا تملك هذه السمة. يمكنني التكرار من خلال جميع الحقول باستخدام التأمل والتحقق من السمة لكل سطر من التقرير ولكن يبدو ذلك طويلًا.

هل هناك حل أنيق لهذا؟

هل كانت مفيدة؟

المحلول

يمكنك مسبقًا الأسماء الخاصة بالخصائص التي تهتم بها (أي تلك التي تحتوي على سمة الوصف) ثم استخدمها للاستيلاء على القيم التي تهتم بها فقط.

لقد اخترقت معًا مثالاً سريعًا على ذلك ، فهو ليس رمزًا أقوى ولكنه يظهر الفكرة العامة (يقدم الكثير من الافتراضات حول الطلب) ولم يحضر سوى السمات مرة واحدة.

(تحرير: أدركنا أننا بحاجة فقط للاتصال بـ 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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top