【问题标题】:Anonymous Type Collection匿名类型集合
【发布时间】:2011-02-12 19:24:34
【问题描述】:

你会如何解决这个问题?我想归还这个收藏:

Public Function GetShippingMethodsByCarrier(ByVal Carrier As ShippingCarrier) As List(of ?)

    Return Carrier.ShippingMethods.Select(Function(x) New With {.ID = x.ID, .Name = String.Format("{0} {1}", Carrier.Name, x.Description)})


End Function

谢谢!!

【问题讨论】:

    标签: vb.net anonymous-types


    【解决方案1】:

    您不能从这样的函数返回匿名类型,因为它没有名称。

    既然这是一个公共函数,它应该有一个明确定义的返回类型。创建一个包含这两个属性的新类。

    如果返回类型是推断的泛型参数,则可以返回它,但这不是您想要的。这对于 LINQ 很有用,其中匿名类型本质上是从参数传递到结果类型,但对您正在做的事情没有用处。

    您也可以使用元组,但是您会丢失属性名称。而且它不可扩展,因为添加新属性会破坏调用者代码。所以我也不建议这样做。

    【讨论】:

    • 所以你必须创建一个类来保存这两个属性并返回一个列表?
    • @Sam 我建议这样做。有一些解决方法,但我不会在这里推荐它们。
    • 那么为什么这不起作用呢? code Dim q = From c In db.Customers where c.ID = 4 Select New With {Key .ID = c.ID, Key .Locations = c.CustomerLocations, .Orders = c.SalesOrders, .SalesRep = c。 SalesRepresentative} For Each l In q.locations Next
    • @Sam 如何将您的新尝试编辑到问题中?您在评论中发布的内容未格式化,可能不完整。
    【解决方案2】:

    这里的问题是你试图以强类型的方式返回一个匿名类型。这在 VB.Net(或 C# 中)是不可能的。匿名类型是匿名的,它们的名称不能在代码中明确说明。解决此问题的两种方法是

    选项 #1 使用/创建一个强命名类型,如下所示

    Structure Item
      Public ID as Integer
      Public Name As String
      Public Description As String
    End Structure
    

    选项#2 设置返回类型为Object,并以后期绑定的方式访问列表

    编辑

    作为 CodeInChaos,可以在通用上下文中以强类型方式返回它们。但这似乎对您解决这个特定问题没有帮助。

    【讨论】:

    • 可以使用泛型推断从函数返回强类型匿名类型。它只是对 OPs 问题没有用。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多