Как Linq-to-Xml преобразует объекты в строки? - PullRequest
0 голосов
/ 25 января 2010

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"

Аналогичным образом обрабатываются и другие основные типы данных.

Итак, кто-нибудь знает, что он делает и где это описано?

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Earmon, ты прав.

Быстрое посещение с помощью Отражатель * показывает, что 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 , Пиалорси и Руссо подтверждают это для другой стороны уравнения (извлечение значений и приведение их), на странице 172:

[при приведении XElement к заданному типу, например, десятичному] ... различные перегрузки Явные [cast] для внутреннего использования XmlConvert из System.Xml или Анализ методов типов .NET.

0 голосов
/ 12 февраля 2010

Хотя я не могу найти документацию MSDN для поддержки этого, когда вы делаете что-то вроде new XElement("bla",false), класс System.Xml.XmlConvert используется для (де) сериализации данных нелокализованным способом.

Другими словами, если кому-то еще нужно знать, что именно делает linq to xml, когда вы добавляете (не-xml) объект в дерево xml, посмотрите на System.Xml.XmlConvert.

...