在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>句法?
解决方法:
你给出的链接中描述的.Value()不是扩展方法,它是一个属性,它特定于VB.net(就像任何其他轴属性:.,…,@ Attribute,(indexer))