Frage

Ich verwende .NET 4.0, C# 4.0 in Visual Studio 2012 mit Code First und Entity Framework.

Ich habe eine Reihe von Klassen, die ich als Grundlage für verschiedene Bericht verwenden möchte. Die Daten für die Berichte finden Sie in einer SQL -Datenbank. Eine Beispielklasse ist:

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; }
}

Die Beschreibungsattribute fungieren sowohl als Header für den Bericht als auch um anzuzeigen, welche Eigenschaften vom Bericht ausgeschlossen werden sollen.

Ich habe eine Methode, um die Header als String -Array aus zu extrahieren Dies Frage

Ich kann auch eine Methode erstellen, die überprüft, ob ein Feld/eine Eigenschaft ein Beschreibungattribut enthält.

Die wichtigste Zutat, die ich fehlt, ist eine einfache und allgemeine Möglichkeit, jede Zeile des Berichts zu generieren, in dem die Felder weggelassen werden, die dieses Attribut nicht haben. Ich kann alle Felder mit Reflexion und Überprüfung des Attributs für jede Zeile des Berichts durch die Reflexion und das Überprüfen von Längstruppen durchführen.

Gibt es eine elegante Lösung dafür?

War es hilfreich?

Lösung

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top