为什么XElement没有GetAttributeValue方法?

14
有时我想知道某些API更改的原因。由于谷歌没有帮助我解决这个问题,也许StackOverflow可以。为什么Microsoft选择删除XML元素上的GetAttribute辅助方法?在System.Xml世界中,有XmlElement.GetAttribute("x")像MSXML之前的getAttribute一样,两者都返回属性值或在缺少时返回空字符串。对于XElement,有SetAttributeValue但是GetAttributeValue没有实现。
当然,修改逻辑以测试和使用XElement.Attribute("x").Value属性并不需要太多工作,但它不如提供单向实用程序函数(SetAttributeValue)方便,并且另一个函数却没有实现似乎很奇怪。有人知道这个决定背后的原因吗?这样我就可以放心了,也许可以从中学到点什么。
2个回答

17

不是 System.Type 哦,你需要什么类型我会更新我的答案。 - Necros
2
不错,我不知道这些类上有类型转换。谢谢! - Kirk Woll
6
我刚刚在这个话题(http://mo.notono.us/2010/08/xelement-xattribute-and-explicit.html)上进行了评论,但我陷入了这样的思考中:显式类型转换运算符是一件坏事情。它们没有智能提示,看起来只是一个普通的强制转换。Kirk的困惑是完全可以理解的。尽管存在类型转换运算符,我认为我会更喜欢使用扩展方法,即使仅仅因为它明显地表明了它所做的工作...顺便提一下,如果有可能属性或元素不存在,那么需要使用可空类型转换。 - Oskar Austegard
请注意,当属性不存在时,此结构将不起作用(与VB.NET的“扩展属性” .Value 不同,它始终返回一个字符串,但您随后可以将其转换为其他类型)。(我注意到Oskar已经提到了这个问题。) - Mark Hurd
SetAttributeValue 可以写入 Size 和 Point 类型,但无法读取:mainForm.Location = (Point)el.Attribute("Location"); mainForm.Size = (Size)el.Attribute("Size"); - Geograph
显示剩余2条评论

5
不确定原因,但使用C#扩展方法,您可以自行解决问题。
public static string GetAttributeValue(this XElement element, XName name)
{
    var attribute = element.Attribute(name);
    return attribute != null ? attribute.Value : null;
}

允许:

element.GetAttributeValue("myAttributeName");

4
我经常会做类似这个函数所做的事情,我认为这是最好的方法,但我很想知道为什么API中缺少GetAttribute函数,尽管在以前的模型中有该函数,并且他们提供了一个setter的帮助器。 - John Lewin
@Geograph 你是什么意思?XML属性值本质上是字符串。如果你想要它成为其他类型,你必须自己进行转换。 - Kirk Woll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接