【发布时间】:2012-06-09 20:32:21
【问题描述】:
在 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
【问题讨论】:
-
它返回“Nothing”而不是空字符串的事实是一个特性,而不是一个错误——它应该可以说抛出一个“对象引用......实例......”异常,因为你是试图获取不存在的第一个元素的值;但是返回 Nothing 是一个很好的改进,同时仍然允许您区分“不匹配”和“没有值的匹配”。
-
@Abacus,在严格意义上,是的,我同意尝试获取空序列的第一个元素的值应该引发异常。但是这个返回空字符串的 Value() 扩展方法在许多场景中非常方便,尤其是呈现可选字段的 UI/显示逻辑。 (一个类似的例子是 jQuery 的“流利”风格,其中选择器可以返回一个空列表,但大多数方法仍然有效,甚至链接。)没什么大不了的,我能够用我自己的自定义扩展方法来实现同样的事情.
标签: c# vb.net extension-methods ienumerable xelement