2010-11-04 12 views
0

J'ai un objet avec quelques éléments qu'il contient:XML Récupération en setter

public class ObjectT{ 
    public int ValueA{ 
    get 
    set; 
    } 

    public string ValueB{ 
    get;set; 
    } 

    public int Description{ 
    get{ 
     XDocument doc = XDocument.Load(@"xmldocument.xml"); 
     return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value); 
    } 
} 

Le Linq pourrait ne pas être parfait, mais bien, vous aurez l'idée. Je lis la description du xml, basée sur les autres propriétés de la classe. Cependant, je n'aime pas comment je dois lire du xml tout le temps. Imaginez que je veux faire 1000 de ces objets, avec 100 de différentes valeurs de description. Je devrais faire 1000 lectures dans le fichier XML.

Y a-t-il une meilleure façon (plus rapide) de faire cela?

cas d'utilisation

Ce que je veux faire est la suivante

ObjectT t = new ObjectT(); 
t.ValueA = 1; 
string test = t.Description; 

ObjectT t1 = new ObjectT; 
t.ValueA = 2; 
string test2 = t.Description; 

... 

Je veux réduire l'IO au xml, parce que je veux créer une charge d'objets.

Répondre

1

Vous dites que vous voulez avoir des milliers de ces objets qui lisent à partir de ce document XML. Mais vous ne voulez pas recharger ce document XML encore et encore. Par conséquent, écrivez une classe d'encapsuleur statique autour de ce document XML qui le charge une seule fois. Fournissez une méthode unique qui récupère la valeur souhaitée et lit les données à partir du cache en mémoire du document XML.

Votre propriété ObjectT.Description appelle ensuite cette méthode pour obtenir les données. Comme la classe wrapper est statique, une seule instance est créée et toutes les instances de votre ObjectT l'utilisent. De plus, le document XML n'est chargé qu'une seule fois.

0

Tu ne peux pas le faire

public class Object{ 

static XDocument doc; 
static LoadXml() 
{ 
    doc = XDocument.Load(@"xmldocument.xml"); 
} 

    public int ValueA{ 
    get 
    set; 
    } 

    public string ValueB{ 
    get;set; 
    } 

    public int Description{ 
    get{ 
     return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value); 
    } 
} 
+0

Hmm, j'ai ajouté un peu ma question pour le rendre plus clair. Je veux créer une charge de ces objets. Donc, sur chaque objet que je crée, je dois maintenant charger dans le XML. –

+0

En outre, il est risqué de charger un document XML dans un constructeur. Si l'opération échoue, le constructeur jette. Lancer dans un constructeur est une très mauvaise idée. –

+0

@Timo J'ai abordé les préoccupations que vous avez mentionnées dans mes commentaires après le code, mais maintenant j'ai révisé le code lui-même pour transmettre davantage mon idée. @Mike cela dépend de la situation, par exemple TcpClient peut jeter de certaines de ses surcharges ctor. En tout cas, j'ai révisé le code pour rendre tout le monde heureux (j'espère) :) –

2

Plusieurs choses viennent à l'esprit:

  • Pour réduire IO, lu une fois le fichier XML, lors de l'initialisation de la classe.
  • Créez un Dictionary<string,int> pour conserver la valeur de chaque valeur de description et l'utiliser comme cache.

XDocument doc; 
Dictionary<string,int> dict; 

public myObject() 
{ 
    doc = XDocument.Load(@"xmldocument.xml"); 
    dict = new Dictionary<string,int>(); 
} 

public int Description{ 
get{ 
    if(!dict.ContainsKey(ValueB)) 
    dict.Add(ValueB, 
       (int)doc.Elements("test").Single(t => t.Element(ValueB).Value)); 

    return dict[ValueB]; 
    } 
} 
+0

Mais, ce que je veux faire (désolé, ce n'était pas clair dans ma question), c'est que je veux créer comme 1000 de ces objets. –

+0

@Timo Willemsen - Je voudrais reconsidérer un design qui nécessite de charger un fichier XML des milliers de fois. – Oded

+0

TryGetValue() serait un peu plus agréable ici –

0

Au moins, vous pouvez garder votre documentation chargé pendant que vous créez vos objets.