在 VB.Net 中,您可以轻松获取 XElement 的第一个子元素的文本值,如下所示:
Dim sChildValue = xeParent.<MyChild>.Value()
当然,C# 不支持该语法,但它产生与 Elements() 方法相同的 IEnumerable(Of XElement) 结果。所以我们可以像这样重写上面的代码:
Dim sChildValue = xeParent.Elements("MyChild").Value()
这个 Value() 扩展方法很方便,因为您经常使用小型 XML 文档,并且只需要第一个匹配的节点。(这个方法让我烦恼的一件事是,如果 IEnumerable 列表由于未找到指定的元素而为空,它似乎返回 Nothing/null。为了解决这个问题,我创建了自己的返回空的 ValueOrBlank() 方法而是在那种情况下使用字符串。)
我的问题是我不能在 C# 中做同样的事情:
var sChildValue = xeParent.Elements("MyChild").Value(); // won't compile, can't find Value() method
我检查了我的引用/导入,它们与相同调用工作的 VB.Net 项目相匹配。幸运的是,我能够使用我的自定义 ValueOrBlank() 扩展方法来完成同样的事情。但我很好奇我的 C# 项目中缺少什么。我尝试在 Visual Studio 中右键单击 Value() 方法调用并单击“转到定义”以查看对象浏览器是否可以告诉我扩展方法的保存位置,但它只显示 System.String 类。这是否意味着这是编译器本身支持的那些鬼鬼祟祟的仅 VB.Net 功能之一,例如 XML Axis < MyChild > 语法?