2012-06-05 25 views
4

在VB.Net你可以很容易得到的XElement的第一個子元素的文本值如下所示:IEnumerable <XElement> .Value()擴展方法在VB.Net中可用但不是C#?

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

當然,這句法沒有在C#的支持,但它會產生相同的IEnumerable(中的XElement )作爲Elements()方法的結果。因此,我們可以重寫上面,像這樣:

Dim sChildValue = xeParent.Elements("MyChild").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()方法調用,然後單擊「Go To Definition」以查看對象瀏覽器是否可以告訴我擴展方法的保留位置,但它只顯示System.String類。這是否意味着這是編譯器本身支持的那些只能使用VB.Net的功能之一,如XML軸< MyChild>語法?

+0

事實上,它返回「Nothing」而不是空字符串是一個功能,而不是一個錯誤 - 它應該可以拋出一個「對象引用...實例。 ..「異常,因爲你試圖獲得第一個元素的值,這不在那裏;但返回沒有什麼是一個很好的改進,同時還允許區分「不匹配」和「無匹配匹配」。 – Abacus

+0

@Abacus,在嚴格意義上說,是的,我同意試圖獲得一個空序列的第一個元素的值應該拋出一個異常。但是這個返回空字符串的Value()擴展方法在許多場景中是一個不錯的方便,特別是UI /顯示邏輯,其中可選字段正在呈現。 (一個類似的例子是jQuery的「流利」風格,其中一個選擇器可以返回一個空列表,但大多數方法仍然可以工作,甚至是鏈接)。沒什麼大不了的,我可以用我自己的自定義擴展方法來實現同樣的事情。 –

回答

3

在你給的鏈接描述.Value()不是一個擴展方法,它是一個屬性,它是專門針對VB.net(像任何其他軸屬性: 。,...,@Attribute,(indexer))

+0

我無法在任何地方找到它的文檔,但GSerg發現它:http://msdn.microsoft.com/en-us/library/bb384768.aspx。有趣的是,我總是認爲這是一種擴展方法,因爲它與Intellisense中的其他擴展方法顯示的顏色相同。但你絕對是對的,它被貼上了「財產」的標籤。 –

0

你需要獲得一個元素:

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

這是不一樣的;如果「MyChild」不存在,將拋出一個NullReferenceException,因爲Element將返回null。 VB的'Value()'是一個真正的擴展方法,[文檔](http://msdn.microsoft.com/en-us/library/bb384768.aspx)接受一個序列並返回第一個「.Value」序列的元素(如果序列爲空,則爲空字符串)。 – GSerg

+0

是的,你說得對,GSerg,這不是一回事。感謝您與MSDN的鏈接,直到現在我還找不到官方文檔。對我來說,這表明IEnumerable(Of XElement).Value()與XML Axis語法屬於同一個類別,它是VB.Net特有的(即使您可以在不更改編譯器的情況下在C#中輕鬆實現它)。將用這個信息寫一個答案。 –

相關問題