我希望能够在代码中采用任何 XElement,并将其作为动态模型直接放入 Razor 视图中。
无论 XElement 的内容如何,如何自动将 XElement 解析为动态对象?
我希望能够在代码中采用任何 XElement,并将其作为动态模型直接放入 Razor 视图中。
无论 XElement 的内容如何,如何自动将 XElement 解析为动态对象?
所以,我尝试了这个。我想我现在明白了为什么没有广泛的代码来执行此操作,并邀请您的评论、编辑和批评:
private dynamic LoadFromXElement(XElement source)
{
var name = source.Name.LocalName;
var descendants = source.Descendants().ToList();
dynamic result = new ExpandoObject();
var resultDict = result as IDictionary<string, object>;
if (descendants.Count == 0)
{
resultDict[name] = source.Value;
return result;
}
var dynamicDescendants = descendants.Select(element => LoadFromXElement(element)).ToList();
resultDict["element"] = dynamicDescendants;
return result;
}
也就是说,我已经对这种方法进行了一些改进......
试试这个扩展
public static T Deserialize<T>(this XmlReader xml)
{
if (xml == null)
{
return default(T);
}
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlReaderSettings();
// No settings need modifying here
return (T)serializer.Deserialize(xml);
}
并打电话
var obj = xElement.CreateReader().Deserialize<objectType>();
如果您使用的是 C# 4,您可以查看ExpandoObject。
提供的链接中的示例将以下 XML 反序列化为动态Person
对象列表:
<Persons>
<Person>
<FirstName> Dino </FirstName>
<LastName> Esposito </LastName>
</Person>
<Person>
<FirstName> John </FirstName>
<LastName> Smith </LastName>
</Person>
</Persons>
解析代码:
public static IList<dynamic> GetExpandoFromXml(String file)
{
var persons = new List<dynamic>();
var doc = XDocument.Load(file);
var nodes = from node in doc.Root.Descendants("Person")
select node;
foreach (var n in nodes)
{
dynamic person = new ExpandoObject();
foreach (var child in n.Descendants())
{
var p = person as IDictionary<String, object>);
p[child.Name] = child.Value.Trim();
}
persons.Add(person);
}
return persons;
}
只是将其转换为动态?
var xele = new XElement("foo", "bar");
var p = (dynamic)xele;
Console.Write(p.Name);
或者你想达到什么目的?