在VB.Net中,您可以轻松地获取XElement的第一个子元素的文本值,如下所示:
当然,C#不支持这种语法,但它产生的IEnumerable(Of XElement)结果与Elements()方法相同。因此,我们可以像下面这样重写上面的代码:
Dim sChildValue = xeParent.<MyChild>.Value()
当然,C#不支持这种语法,但它产生的IEnumerable(Of XElement)结果与Elements()方法相同。因此,我们可以像下面这样重写上面的代码:
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 >语法?