2010-01-25 8 views
0

Linq-to-Xml contient beaucoup de méthodes qui vous permettent d'ajouter des objets arbitraires à un arbre xml. Ces objets sont convertis en chaînes par certains moyens, mais je n'arrive pas à trouver la spécification de la façon dont cela se produit. La conversion dont je parle est mentionnée (mais non spécifiée) in MSDN. J'ai besoin de cela pour javascript interop, mais cela n'a pas beaucoup d'importance à la question. Linq to Xml ne fait pas qu'appeler .ToString()Comment Linq-to-Xml convertit-il les objets en chaînes?

Tout d'abord, il va accepter null éléments, et d'autre part, il fait des choses pas mise en œuvre .ToString() fait:

Par exemple:

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" 

D'autres types de données de base sont également traités spécialement. Donc, est-ce que quelqu'un sait ce qu'il fait et où cela est décrit?

Répondre

0

Bien que je ne trouve pas de documentation MSDN pour cela, lorsque vous faites quelque chose comme new XElement("bla",false) la classe System.Xml.XmlConvert est utilisée pour (dé) sérialiser les données de manière non localisée. En d'autres termes, si quelqu'un d'autre a besoin de savoir exactement ce que fait linq à xml lorsque vous ajoutez un objet (non-xml) dans un arbre xml, regardez System.Xml.XmlConvert.

1

Earmon, vous avez raison.

Une visite rapide avec Reflector* révèle que XElement et les amis vont essayer de jeter la valeur à tous les types « simples », puis appeler une méthode XmlConvert.ToString() appropriée.

Voici un extrait (légèrement modifié), à titre d'illustration:

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

Si l'objet n'est pas un type 'simple', obj.ToString alors() sera utilisé.

C'est très bien, parce que c'est presque la seule bonne façon de le faire.

Bien sûr, vous voulez normalement prendre avec un grain de sel tout ce qui est basé sur "c'est comme ça aujourd'hui". En effet, MS pourrait un jour changer la façon dont ils le font. Nous nous en fichons - ce qui compte, c'est que la sémantique soit gravée dans la pierre.

* (.. Liens du produit sont toujours fournis pour des raisons pratiques, je n'ai aucune relation avec le produit ou son fabricant, autre que d'être un client indirect)

Mise à jour: En Introducing Microsoft LINQ, Pialorsi et Russo confirme cela pour l'autre côté de l'équation (extraire des valeurs et les convertir), à la page 172:

[lors de la conversion d'un XElement en un type donné comme Dec imal] ... les divers Explicit [cast] les surcharges de l'opérateur utilisent en interne XmlConvert de Système.Xml ou Parse méthodes de types .NET.

Questions connexes