【问题标题】:IEnumerable<XElement>.Value() extension method available in VB.Net but not C#?IEnumerable<XElement>.Value() 扩展方法在 VB.Net 中可用,但在 C# 中不可用?
【发布时间】: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


【解决方案1】:

您提供的链接中描述的.Value() 不是扩展方法,它是一个属性并且特定于 VB.net(与任何其他轴属性一样:., ..., @Attribute, (indexer))

【讨论】:

  • 我在任何地方都找不到它的文档,但 GSerg 找到了它:msdn.microsoft.com/en-us/library/bb384768.aspx。有趣的是,我一直认为它是一种扩展方法,因为它以与 Intellisense 中的其他扩展方法相同的颜色显示。但你说得对,它被标记为“财产”。
【解决方案2】:

你需要得到一个单个元素:

var value = parent.Element("MyChild").Value;

【讨论】:

  • 这不一样;如果“MyChild”不存在,将抛出 NullReferenceException,因为 Element 将返回 null。 VB的Value()是一个真正的扩展方法,即documented接受一个序列并返回序列第一个元素的.Value(如果序列为空则返回空字符串)。
  • 是的,你是对的 GSerg,这不是一回事。并感谢您提供指向 MSDN 的链接,直到现在我才找到官方文档。对我来说,这表明 IEnumerable(Of XElement).Value() 与 XML Axis 语法属于同一类别,后者特定于 VB.Net(即使您可以在 C# 中轻松实现它而无需更改编译器。)我是打算用这些信息写一个答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多