Pregunta

Estoy usando .NET 4.0, C# 4.0 en Visual Studio 2012 con Code First y Entity Framework.

Tengo un conjunto de clases que quiero usar como base para varios informes. Los datos para los informes se mantienen en una base de datos SQL. Una clase de ejemplo es:

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 descripción atribuye actúa como los encabezados para el informe y también para indicar qué propiedades deben excluirse del informe.

Tengo un método para extraer los encabezados como una matriz de cadenas de este pregunta

También puedo generar un método que verifica si un campo/propiedad tiene un atributo de descripción.

El ingrediente clave que me falta es una forma sencilla y genérica de generar cada línea del informe que omite los campos que no tienen este atributo. Puedo iterar a través de todos los campos utilizando la reflexión y verificación del atributo para cada línea del informe, pero eso parece largo sin aliento.

¿Hay una solución elegante para esto?

¿Fue útil?

Solución

Puede precisar los nombres de las propiedades que le interesan (es decir, las que tienen el atributo de descripción) y luego usarlos para obtener solo los valores que le interesan.

He pirateado un ejemplo rápido de esto, no es el código más robusto, pero muestra la idea general (hace muchas suposiciones sobre el pedido) y solo obtuve los atributos una vez.

(Editar: Me di cuenta de que solo necesitábamos llamar a GetProperties una vez para todo).

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

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

Esto te dará un IEnumerable<IEnumerable<object>>, o en otras palabras, una lista de filas y para cada fila, una lista de columnas (con el valor de cada columna como un objeto).

Luego podría iterar a través de esto de la siguiente manera (pseudo código)

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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top