Visual Basic XML Literals嵌入式表达式 - 我可以做简单的数学运算吗?

时间:2015-02-10 01:29:23

标签: xml vb.net visual-studio linq-to-xml xml-literals

我对我希望是一个简单的问题感到困惑。我试图嵌入一个简单的公式,增加一个变量,作为XML文档的“行号”。在visual basic中编写文字XML。这是代码的样子:

<%= From d In orderData
                                       Select <ItemOut quantity=<%= d.OrderQuantity %> lineNumber=<%= i %>>
                                                  <ItemID>
                                                      <SupplierPartID><%= d.VendorPartNo %></SupplierPartID>
                                                  </ItemID>
                                                  <ItemDetail>
                                                      <UnitPrice>
                                                          <Money currency="USD"><%= d.PricePerPackage %></Money>
                                                      </UnitPrice>
                                                      <Description xml:lang="en"><%= d.Description %></Description>
                                                      <UnitOfMeasure><%= d.OrderUOM %></UnitOfMeasure>
                                                  </ItemDetail>
                                                  <%= i = i + 1 %>
                                              </ItemOut>
                                       %>

我期望OrderData中d的每次迭代都勾选i + 1,但是,它只是返回“false”。请在此处查看输出XML:

<ItemOut quantity="1" lineNumber="1">
        <ItemID>
          <SupplierPartID>99999</SupplierPartID>
        </ItemID>
        <ItemDetail>
          <UnitPrice>
            <Money currency="USD">0.00</Money>
          </UnitPrice>
          <Description xml:lang="en">Tub and Tile Caulk Biscuit</Description>
          <UnitOfMeasure>cs</UnitOfMeasure>
        </ItemDetail>false</ItemOut>
      <ItemOut quantity="1" lineNumber="1">
        <ItemID>
          <SupplierPartID>999999</SupplierPartID>
        </ItemID>
        <ItemDetail>
          <UnitPrice>
            <Money currency="USD">0.00</Money>
          </UnitPrice>
          <Description xml:lang="en">Tub and Tile Caulk Almond</Description>
          <UnitOfMeasure>cs</UnitOfMeasure>
        </ItemDetail>false</ItemOut>

有可能做这种事吗?我甚至尝试过调用函数:

lineNumber=<%= incrementI(i) %>>

但这也会导致“假”作为输出。我在这里错过了什么? 感谢您的帮助!

Visual Studio 2013

Edit-- 这是我所指的功能:

Private Function incrementI(i As Integer)
    Return i = i + 1
End Function

1 个答案:

答案 0 :(得分:0)

如果您将IncrementI定义为通过引用而不是按值接受其参数,则可以这样写:

Sub Main()
    Dim j As Integer = 0

    Dim x = <sample><thing><%= IncrementI(j) %></thing><thing><%= IncrementI(j) %></thing></sample>

    Console.WriteLine(x)
    Console.ReadLine()
End Sub

Function IncrementI(ByRef i As Integer) As Integer
    i = i + 1 'This is now a statement rather than an expression, so its assignment
    Return i
End Function

生成此XML:

<sample>
  <thing>1</thing>
  <thing>2</thing>
</sample>

正如评论中所指出的,Visual Basic使用=进行赋值和相等。如果您在需要表达式的上下文中使用它,您将获得返回TrueFalse的相等比较。

如果你打开Option Strict并定义函数返回类型,那么编译器会帮助你看到你的函数没有修复问题:

'Broken code
Private Function incrementI(i As Integer) as Integer
    Return i = i + 1
End Function

当Option Strict打开时,上面会产生错误

  

Option Strict On禁止从“Boolean”到“Integer”的隐式转换。