Search code examples
c#vb.netextension-methodsienumerablexelement

IEnumerable<XElement>.Value() extension method available in VB.Net but not C#?


In VB.Net you can easily get the text value of the first child element of an XElement like so:

Dim sChildValue = xeParent.<MyChild>.Value()

Of course that syntax is not supported in C#, but it produces the same IEnumerable(Of XElement) result as the Elements() method. So we can rewrite the above like so:

Dim sChildValue = xeParent.Elements("MyChild").Value()

This Value() extension method is handy because often you are working with small XML documents and you just want the first node that matches. (One thing that annoys me about this method is that it seems to return Nothing/null if the IEnumerable list is empty due to the specified element not being found. To work around this I have created my own ValueOrBlank() method that returns an empty string in that situation instead.)

My problem is that I can't do the same thing in C#:

var sChildValue = xeParent.Elements("MyChild").Value(); // won't compile, can't find Value() method

I checked my references/imports and they match the VB.Net project where the same call works. Fortunately I am able to use my custom ValueOrBlank() extension method to accomplish the same thing. But I'm curious as to what's missing in my C# project. I tried right-clicking on the Value() method call in Visual Studio and clicking "Go To Definition" to see if the Object Browser could tell me where the extension method is kept, but it just shows the System.String class. Does that mean this is one of those sneaky VB.Net-only features that the compiler itself supports, like the XML Axis < MyChild > syntax?


Solution

  • .Value() described in link you gave is not an extension method, it's a property and it's specific to VB.net (like any other axis properties: ., ..., @Attribute, (indexer))