Question

J'utilise .NET 4.0, C # 4.0 dans Visual Studio 2012 avec Code First et Entity Framework.

J'ai un ensemble de classes que je souhaite utiliser comme base pour divers rapports. Les données des rapports sont conservées dans une base de données SQL. Un exemple de classe est:

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

La description attribue agit à la fois comme les en-têtes du rapport et pour indiquer quelles propriétés doivent être exclues du rapport.

J'ai une méthode pour extraire les en-têtes en tant que tableau de chaîne à partir de cette question

Je peux également générer une méthode qui vérifie si un champ / propriété a un attribut description.

L'ingrédient clé qui me manque est un moyen simple et générique de générer chaque ligne du rapport omettant les champs qui n'ont pas cet attribut. Je peux parcourir tous les champs en utilisant la réflexion et la vérification de l'attribut pour chaque ligne du rapport, mais cela semble long.

Y a-t-il une solution élégante à cela?

Était-ce utile?

La solution

Vous pouvez pré-cacher les noms des propriétés qui vous intéressent (c'est-à-dire celles avec l'attribut description), puis les utiliser pour ne saisir que les valeurs qui vous intéressent.

J'ai piraté un exemple rapide de cela, ce n'est pas le code le plus robuste, mais cela montre l'idée générale (fait beaucoup d'hypothèses sur la commande) et j'ai obtenu les attributs uniquement.

(Modifier: réalisé que nous n'avions besoin d'appeler GetProperties qu'une seule fois pour tout).

var whitelist = typeof (DocumentTrackerChaseReport)
    .GetProperties()
    .Where(x => Attribute.IsDefined(x, typeof (DescriptionAttribute)));

var rows = things.Select(x => whitelist.Select(y => y.GetValue(x) ?? ""));

Cela vous donnera un IEnumerable<IEnumerable<object>>, ou en d'autres termes, une liste de lignes et pour chaque ligne, une liste de colonnes (avec la valeur de chaque colonne étant un objet).

Vous pourriez ensuite parcourir cela comme suit (pseudo code)

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top