2008-11-16 5 views

답변

3

글쎄, 당신은 유형 정보 만 실행 시간에 알려져 주어진 멋진 정적으로 입력 된 API를받지 않습니다 사전에

<node> 
    <name>nodeName</name> 
    <type>string</type> 
</node> 
<node> 
    <name>0</name> 
    <type>bool</type> 
</node> 
<node> 
    <name>42</name> 
    <type>int</type> 
</node> 

감사합니다 : 예를 들어

적절한 하위 요소를 찾고 System.Object을 반환하는 XElement의 확장 메서드입니다. (테스트되지 않은) 예를 들어 :

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); 
    } 
} 

그것은 내가 데이터 형식을 설계하는 것 방법은 아니지만, 그것은 당신에 추력 되 않다면 ...

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); 
}