你好!
使用LINQ to XML,是否可以使用一个节点的字符串值来告诉另一个节点所呈现的字段类型?
例如:
<node>
<name>nodeName</name>
<type>string</type>
</node>
<node>
<name>0</name>
<type>bool</type>
</node>
<node>
<name>42</name>
<type>int</type>
</node>
提前感谢你
好的,鉴于类型信息仅在执行时才能知道,因此您将无法获得漂亮的静态类型化API - 但是您可以轻松地编写一个扩展方法以查找适当的子元素并返回System.Object
。例如(未经测试):
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);
}
}
虽然这不是我设计数据格式的方式,但如果它被强加给你...
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 );
}