0

Linq-to-Xml 包含许多允许您将任意对象添加到 xml 树的方法。这些对象通过某种方式转换为字符串,但我似乎无法找到这种情况发生的规范。我所指的转换在 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"

其他基本数据类型也有类似的特殊处理。

那么,有人知道它在做什么以及在哪里描述的吗?

4

2 回答 2

1

厄尔蒙,你是对的。

快速访问Reflector *会发现,XElement朋友们会尝试将值转换为所有“简单”类型,然后调用适当的XmlConvert.ToString()方法。

这是一个(稍作编辑)摘录,用于说明:

if (value is string)
{
    str = (string) value;
}
else if (value is double)
{
    str = XmlConvert.ToString((double) value);
}
// ...

如果对象不是“简单”类型,则将使用 obj.ToString()。

这非常好,因为这几乎是唯一正确的方法。

当然,您通常希望对任何基于“今天就是这样”的东西持保留态度。事实上,MS 有朝一日可能会改变他们的工作方式。我们不在乎——重要的是语义是刻在石头上的。

*(为方便起见,始终提供产品链接。我与产品或其制造商没有任何关系,除了是间接客户。)

更新:介绍 Microsoft LINQ中,Pialorsi 和 Russo 确认了等式的另一端(提取值并转换它们),第 172 页:

[当将 XElement 转换为像 Decimal 这样的给定类型时] ...各种显式[cast] 运算符重载在内部使用System.Xml中的XmlConvert或.NET 类型的Parse方法。

于 2010-03-12T18:48:57.117 回答
0

尽管我找不到 MSDN 文档来支持这一点,但是当您执行类似new XElement("bla",false)该类System.Xml.XmlConvert的操作时,它会以非本地化的方式(反)序列化数据。

换句话说,如果其他人需要知道当您将(非 xml)对象添加到 xml 树中时 linq to xml 究竟做了什么,请查看System.Xml.XmlConvert.

于 2010-02-12T17:25:08.153 回答