在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>語法?
事實上,它返回「Nothing」而不是空字符串是一個功能,而不是一個錯誤 - 它應該可以拋出一個「對象引用...實例。 ..「異常,因爲你試圖獲得第一個元素的值,這不在那裏;但返回沒有什麼是一個很好的改進,同時還允許區分「不匹配」和「無匹配匹配」。 – Abacus
@Abacus,在嚴格意義上說,是的,我同意試圖獲得一個空序列的第一個元素的值應該拋出一個異常。但是這個返回空字符串的Value()擴展方法在許多場景中是一個不錯的方便,特別是UI /顯示邏輯,其中可選字段正在呈現。 (一個類似的例子是jQuery的「流利」風格,其中一個選擇器可以返回一個空列表,但大多數方法仍然可以工作,甚至是鏈接)。沒什麼大不了的,我可以用我自己的自定義擴展方法來實現同樣的事情。 –