【发布时间】:2021-08-04 13:05:20
【问题描述】:
跟进我的previous question。我现在正试图找到一个特定的 XML 部分。例如在以下 XML (部分)
<?xml version="1.0" encoding="utf-8" ?>
<definition date="2021-04-30" version="1.01">
<changes>
<change number="1" date="2021-04-30" description="Added .." />
<change number="2" date="2021-04-30" description="Changes in .." />
<change number="3" date="2021-04-30" description="Fixed .." />
<change number="4" date="2021-05-11" description="Added " />
</changes>
<general>
<styles>
<style name="title">
<font name="Arial" size="12" bold="true"/>
</style>
<style name="general">
<font name="Courier new" size="10" bold="true" />
</style>
<style name="header">
<font name="Courier new" size="10" bold="false" />
</style>
</styles>
</general>
我想找零钱 3。 我正在使用 Dandraka XML-Utilities 使 XML 成为 ExpandoObject。这应该让我很容易获得特定的价值观。例如,使用上述内容,我可以像这样获得定义日期和版本:
Dim strXML As String
strXML = File.ReadAllText("C:\Tools\ReportDefinitions.xml")
Dim def As Object
def = XmlSlurper.ParseText(strXML)
Console.WriteLine(def.date)
Console.WriteLine(def.version)
我想用Linq就行了:def.changes.changeList。但很简单:
def.changes.changeList.where(Function(c) c.number = "1").count()
在where 部分给出错误。已经在 SO 上进行了搜索,但大多数示例都是用 C# 编写的,并且将它们翻译成 VB.net 最终会导致无法编译的结果。
假设我必须投射它,但怎么做?
var iet = def.changes.changeList;
var iets = (IEnumerable)def.changes.changeList;
var iets2 = iets.Cast<dynamic>();
var iets3 = iets2.FirstOrDefault(p => p.number == "3");
int iets4 = iets3.number;
Console.WriteLine(iets4);
现在在 VB.Net 中,我可以这样做:
Dim iet As Object = def.changes.changeList
Dim iets = CType(def.changes.changeList, IEnumerable)
但是这一行:
var iets2 = iets.Cast<dynamic>();
不知道如何将其转换为 VB.Net..
谢谢
【问题讨论】:
-
dynamic是让 C# 让您进行后期绑定的方式。我认为 VB 中的等价物就是Cast(Of Object)。请注意,IEnumerable.Cast(Of T)将为您提供来自IEnumerable的IEnumerable(Of T)。
标签: xml vb.net linq expandoobject