2010-09-14 3 views
0

J'utilise C# avec le framework .NET 3.5 pour écrire une application.Aide sur l'utilisation de LINQ et XML avec Enums

J'ai un ENUM comme celui-ci,

public static enum SettingOneType { FooA, FooB, FooC } 

J'ai aussi un XDocument que je charge comme celui-ci dans une méthode Load(),

LoadXML(){ 
    ... 
    XDocument SettingsDocument; 
    if(File.Exists(path) 
    { 
    XElement SettingsElement = new XElement("DeviceSettings", 
     new XElement("Setitng1", SettingOneType.FooA.ToString()), 
     new XElement("Setting2", ... )); 


    XDeclaration dec = new XDeclaration("1.0", "UTF-8", "yes"); 
    SettingsDocument = new XDocument(dec, SettingsElement); 
    SettingsDocument.Save(xpath); 
    } 
    else SettingsDocument = XDocument.Load(path); 
} 

Ce que je me demande est, est-il un moyen de lire ces paramètres d'une manière fortement typée. Parce que je veux avoir une propriété dans mon application qui accédera à la valeur dans le fichier xml comme ça ...

public SettingOneType SettingOne 
{ 
    get{ 
     SettingOneType x = SettingsDocument. //Here I know I can use LINQ statements to file the value I want but is there a way to cast the value to the correct type without using a giant switch statement or something? 
    } 
} 

NOTE: Avant que quelqu'un suggère que j'utiliser les fichiers intégrés Paramètres d'application qui sont disponibles avec. NET, ne dérange pas. J'utilise habituellement ceux-ci mais pour ce projet il y a une raison que je ne peux pas que je ne veux pas expliquer.

Répondre

1

Avoir la valeur d'énumération comme une chaîne, vous pouvez utiliser Enum.Parse pour analyser ce:

string foo = "FooA"; 
SettingOneType settingOneType = 
    (SettingOneType)Enum.Parse(typeof(SettingOneType), foo); 
1

vous pouvez utiliser une certaine forme de sérialisation (comme le DataContractSerializer) pour un objet typé persistent au format XML. Vous pouvez ensuite lire l'ensemble de l'objet de manière sécurisée au lieu de gérer manuellement des nœuds XML individuels.

Par exemple, créer une classe DocumentSettings et persister à XML en utilisant le code comme le suivant:

internal string Serialize(Object documentSettings) 
{ 
    StringBuilder serialXML = new StringBuilder(); 
    DataContractSerializer dcSerializer = new DataContractSerializer(obj.GetType()); 
    using (XmlWriter xWriter = XmlWriter.Create(serialXML)) 
    { 
     dcSerializer.WriteObject(xWriter, obj); 
     xWriter.Flush(); 
     return serialXML.ToString(); 
    } 
} 

Je vais laisser à vous de trouver le code désérialisation (son assez simple)

+0

Donc, ce serait lire et enregistrer tous les paramètres à la fois? – PICyourBrain

+0

Oui. Je recommande également cela, c'est plus facile que les alternatives, sauf si vous avez d'énormes quantités de données - alors peut-être une alternative devrait être envisagée. Et je veux dire énorme - la sérialisation XML est _quite_ performant. –

+0

JordanS: Oui. La mise à jour d'un seul paramètre implique généralement la lecture de la classe entière, la modification de la valeur et la sérialisation de tous les fichiers. Le surcoût est minime pour les petites classes, mais évidemment si vos fichiers de paramètres sont énormes, ce n'est pas la meilleure approche. – Addys

0

Stockez les valeurs XML sous forme de nombres, puis entrez int.parse la valeur de la chaîne et copiez-la dans le type enum. Chaque membre de l'énumération correspond à une valeur int par défaut et sera converti de manière appropriée, ils sont incrémentés de 0 par défaut dans l'ordre dans lequel ils sont définis.

Lorsque vous créez les valeurs au lieu de:

new XElement("Setitng1", SettingOneType.FooA.ToString()) 

faire:

new XElement("Setitng1", ((int)SettingOneType.FooA).ToString()) 

Ensuite, vous les lisez retour:

SettingOneType mySetting = (SettingOneType)int.Parse(myXElem.Value); 

Vous pourriez être en mesure de simplement faire une implicite jeté là, je ne me souviens pas mais c'est la jist de toute façon ..