我在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