2

首先,如果我对这个有点不理解,请原谅,因为我对 .net、匿名类型和 LINQ 有点陌生。坦率地说,我有点挣扎,并计划在下个月就该主题进行大量学习。我知道的足够多,知道我想出的方法不是正确的。

我得到了一个项目来创建各种分隔输出格式,这些格式源自已经存在了一段时间的标准报告提要。为此已经有一个框架,我只是添加更多格式和一些新的输出机制。(下面的一些细节可能无关紧要,但为了清楚起见,我将包括在内。)

来自数据层的查询返回一个 LLBLGEN TypedList。然后应用 LINQ 查询来创建各种提要输出格式,从而生成 IEnumerable 匿名对象。作为我项目的一部分,我将获取该对象并将其输出为逗号分隔的文件。

通过查看下面的示例和其他一些示例,我已经能够将一个工作功能组合在一起,但我确信这绝不是完成任务的正确方法(使用反射等)。也就是说,“正确的方式”让我望而却步!即使是指向正确方向的指针也会很有帮助。

在 C# 中将匿名类型转换为键/值数组?

C# 中值是匿名类型的字典

Private Sub SendExport(feed As IEnumerable, filename As String)

    Dim delimited As New StringBuilder

    Dim type = feed(0).GetType
    Dim props = type.GetProperties
    delimited.AppendLine(String.Join(",", props.Select(Function(p) p.Name).ToList))

    For Each item In feed
        Dim itemType = item.GetType
        Dim typeProps = itemType.GetProperties
        delimited.AppendLine(String.Join(",", typeProps.Select(Function(p) p.GetValue(item)).ToList))
    Next

    Debug.WriteLine(delimited.ToString)

    Response.Clear()

    Response.AddHeader("Cache-Control", "must-revalidate")
    Response.AddHeader("Pragma", "must-revalidate")
    Response.AddHeader("Content-type", "application/vnd.ms-excel")
    Response.AddHeader("Content-disposition", String.Format("attachment; filename={0}.csv", filename))
    Response.Write(delimited.ToString)
    Response.End()

End Sub
4

2 回答 2

0

我不是 VB 专家,但我认为您可以将以下几行从循环中删除:

Dim itemType = item.GetType
Dim typeProps = itemType.GetProperties

只需再次重用props列表:

For Each item In feed
    delimited.AppendLine(String.Join(",", props.Select(Function(p) p.GetValue(item)).ToList))
Next
于 2012-11-13T21:12:15.760 回答
0

这个问题很老了,但为了可能帮助下一个人,我认为我会提供我最终在自己的学习和研究中得到的答案。

简而言之,蒂姆·施梅尔特在对我最初要求的评论中说得对:

您不应将匿名类型传递到方法范围之外,直接使用它或从一开始就使用另一种类型。

从设计的角度来看,我试图完成的工作基本上是不正确的,并且基本上是对匿名类型的滥用。就我而言,正确的“答案”是简单地重构报告层以全面使用强类型类。LINQ 查询直接填充类,等等。这是一个相对较小的工作,最终使事情变得更干净。

于 2013-01-14T22:39:20.110 回答