【问题标题】:C# 4.0 Generic report generator from a class来自类的 C# 4.0 通用报告生成器
【发布时间】:2013-11-07 15:20:48
【问题描述】:

我在 Visual Studio 2012 中使用 .NET 4.0、C# 4.0 以及 Code 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; }
}

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

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

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

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

有没有优雅的解决方案?

【问题讨论】:

  • 如果你想让这个完全通用/常规,那么在这里使用反射是不可避免的,但是你表达问题的方式听起来你对此并不满意。您能否更具体地说明您对优雅的定义,可能会帮助您更快地得到答案。
  • 谢谢。不是我想避免反射,而是检查每一行的每一列感觉并不高效或优雅。

标签: c# .net generics system.reflection


【解决方案1】:

您可以预先缓存您感兴趣的属性的名称(即具有 description 属性的属性),然后使用这些名称仅获取您感兴趣的值。

我已经编写了一个简单的示例,它不是最强大的代码,但它显示了总体思路(对排序做出了很多假设)并且只获取了一次属性。

(编辑:意识到我们只需要为所有事情调用一次 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
}

【讨论】:

  • 谢谢 - 这正是我想要的。
  • 还有一个问题。除 v.GetValue 外,一切正常。它会生成错误 v 无法识别。谢谢
  • 糟糕,感谢现场。在没有编译器的情况下重命名事物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多