Linq-to-Xml包含许多方法,允许您将任意对象添加到xml树。这些对象通过某种方式转换为字符串,但我似乎无法找到如何发生这种情况的规范。我提到的转换(但未指定)in MSDN。
我碰巧需要这个用于javascript互操作,但这对问题没那么重要。
Linq to Xml不只是调用.ToString()
。首先,它会接受null
个元素,其次,它正在做的事情.ToString()
实现没有:
例如:
new XElement("elem",true).ToString() == "<elem>true</elem>"
//but...
true.ToString() == "True" //IIRC, this is culture invariant, but in any case...
true.ToString(CultureInfo.InvariantCulture) == "True"
其他基本数据类型也经过特殊处理。
那么,是否有人知道它在做什么以及在哪里描述?
答案 0 :(得分:1)
Earmon,你是对的。
使用Reflector * 快速访问后,XElement
和朋友会尝试将值转换为所有“简单”类型,然后调用相应的{{ 1}}方法。
这是一个(略有编辑的)摘录,例如:
XmlConvert.ToString()
如果对象不是'简单'类型,则将使用obj.ToString()。
这非常好,因为这几乎是唯一正确的方法。
当然,你通常想要根据“今天是怎样的”来获取任何东西。事实上,MS有朝一日可能会改变他们的做法。我们不在乎 - 重要的是语义是刻在石头上的。
*(产品链接总是为方便起见而提供。除了作为间接客户外,我与产品或其制造商没有任何关系。)
<强> 更新 强> 在Introducing Microsoft LINQ中,Pialorsi和Russo在等式的另一边(提取值并将其投射)确认了这一点,第172页:
[将XElement转换为给定类型,如Decimal] ...各种 Explicit [cast]运算符重载内部使用 System.Xml中的 XmlConvert 或解析 .NET类型的方法。
答案 1 :(得分:0)
虽然我找不到MSDN文档来支持这一点,但当你执行new XElement("bla",false)
之类的操作时,System.Xml.XmlConvert
类用于(非)以非本地化的方式序列化数据。 / p>
换句话说,如果在xml树中添加(非xml)对象时,如果其他人需要知道linq到xml的确切作用,请查看System.Xml.XmlConvert
。