문제

Code First 및 Entity Framework와 함께 Visual Studio 2012에서 .NET 4.0, 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; }
}

설명 속성은 보고서의 헤더로 작용하고 보고서에서 제외 할 속성을 나타냅니다.

헤더를 문자열 배열로 추출하는 메소드가 있습니다. 이것 의문

필드/속성에 설명 속성이 있는지 확인하는 메소드를 생성 할 수도 있습니다.

내가 놓친 주요 성분은이 속성이없는 필드를 생략하는 보고서의 각 줄을 생성하는 간단하고 일반적인 방법입니다. 반사를 사용하여 모든 필드를 반복하고 보고서의 각 줄에 대한 속성을 확인할 수는 있지만 긴 감기처럼 보입니다.

이것에 대한 우아한 해결책이 있습니까?

도움이 되었습니까?

해결책

관심있는 속성의 이름을 사전 캐시 할 수 있습니다 (예 : 설명 속성이있는 속성)를 사용하여 관심있는 값 만 가져 오기 위해 사용하십시오.

나는 이것의 빠른 예를 해킹했는데, 그것은 가장 강력한 코드는 아니지만 일반적인 아이디어 (순서에 대한 많은 가정을 만듭니다)를 보여주고 속성을 한 번만 가져 왔습니다.

(편집 : 모든 것에 대해 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