1

我在带有 Code First 和实体框架的 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; }
}

Description 属性既可用作报告的标题,也可指示要从报告中排除的属性。

我有一种方法可以从这个问题中提取标题作为字符串数组

我还可以生成一个方法来检查字段/属性是否具有描述属性。

我缺少的关键要素是一种直接且通用的方式来生成报告的每一行,省略不具有此属性的字段。我可以使用反射遍历所有字段并检查报告每一行的属性,但这似乎很冗长。

有一个优雅的解决方案吗?

4

1 回答 1

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
}
于 2013-11-07T17:17:50.237 回答