2013-11-07 4 views
1

Я использую .NET 4.0, C# 4.0 в Visual Studio 2012 с Code First и Entity Framework.C# 4.0 Генерирующий генератор отчетов из класса

У меня есть набор классов, которые я хочу использовать в качестве основы для различных отчетов. Данные для отчетов хранятся в базе данных 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; } 
} 

The Описание атрибутов действует как заголовки для отчета, а также указать, какие свойства должны быть исключены из отчета.

У меня есть метод для извлечения заголовков как строковый массив из this вопроса

я также могу генерировать метод, который проверяет, если поле/свойство имеет атрибут описания.

Ключевой компонент, которого я пропускаю, - это простой и общий способ генерации каждой строки отчета, опуская поля, которые не имеют этого атрибута. Я могу проходить через все поля, используя отражение и проверку атрибута для каждой строки отчета, но это кажется длинным.

Есть ли элегантное решение?

+0

Если вы хотите сделать это совершенно общий/обычный, то использование отражения здесь неизбежно, но, как вы сформулированы вопросы звучит как вы недовольны этим. Можете ли вы уточнить, что вы считаете элегантным, может помочь вам быстрее получить ответ. – gooid

+0

Спасибо. Дело не в том, что я хочу избежать отражения, но проверка каждого столбца каждой строки не кажется эффективной или изящной. –

ответ

1

Вы можете предварительно кэш имена свойств, которые вы заинтересованы в (то есть тех, с атрибутом описания), а затем использовать те только захватить значения интересующие вас.

Я взломал вместе быстрый пример этого, это не самый надежный код, но он показывает общую идею (делает много предположений о заказе) и только извлекал атрибуты один раз.

(Изменить: реализовано, что нам нужно было только один раз вызвать 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 
} 
+1

Спасибо - это именно то, что я искал. –

+0

Еще один вопрос. Все работает отлично, за исключением v.GetValue. Он генерирует ошибку v не распознается. Thanks –

+0

Упс, спасибо за место. Переименованы без присутствия компилятора. – gooid

Смежные вопросы