西洛!
是否可以使用一个节点的字符串值来告诉使用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>
提前致谢
答案 0 :(得分:3)
好吧,鉴于类型信息仅在执行时已知,您将无法获得一个好的静态类型API - 但您可以轻松地在XElement上编写一个扩展方法,该方法查找相应的子元素并返回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);
}
}
这不是我设计数据格式的方式,而是如果它被推到你身上......
答案 1 :(得分: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 );
}