2008-11-16 6 views

Répondre

3

Eh bien, vous ne serez pas une belle API statiquement typé étant donné que les informations de type est seulement connue au moment de l'exécution - mais vous pouvez facilement écrire une méthode d'extension sur XElement qui recherche les sous-éléments appropriés et renvoie System.Object. Par exemple (non testé):

public static object ParseValue(this XElement element) 
{ 
    XElement name = element.Element("name"); 
    XElement type = element.Element("type"); 
    // Insert error handling here :) 

    switch (type.Value) 
    { 
     case "int": 
      return int.Parse(name.Value); 
     case "string": 
      return name.Value; 
     case "bool": 
      return name.Value == "1"; // Or whatever 
     default: 
      throw new ArgumentException("Unknown element type " + type.Value); 
    } 
} 

Ce n'est pas comment je concevoir un format de données, mais si elle est en cours de poussée sur vous ...

2
public static void Main() { 
    var xmlNodes = new XElement("Nodes", 
     new XElement("Node", 
      new XElement("Name", "nodeName"), 
      new XElement("Type", "string") 
     ), 
     new XElement("Node", 
      new XElement("Name", "True"), 
      new XElement("Type", "bool") 
     ), 
     new XElement("Node", 
      new XElement("Name", "42"), 
      new XElement("Type", "int") 
     ) 
    ); 

    var converters = new Dictionary<string,Func<string,object> > { 
     { "string", val => val }, 
     { "bool", val => Boolean.Parse(val) }, 
     { "int", val => Int32.Parse(val) } 
    }; 

    var values = 
     from node in xmlNodes.Elements("Node") 
     select converters[ node.Element("Type").Value ](node.Element("Name").Value); 

    foreach(var value in values) 
     Console.WriteLine(value.GetType().ToString() + ": " + value); 
}