Вопрос

Я использую .NET 4.0, C# 4.0 в Visual Studio 2012 с кодом 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