我希望能够在代码中使用任何XElement,并将其直接放入Razor视图中作为动态模型。
无论XElement的内容如何,如何自动将XElement解析为动态对象?
答案 0 :(得分:1)
所以,我试过这个。我想我现在明白为什么没有广泛的代码来做这件事,并邀请你的评论,编辑和批评:
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;
}
那就是说,我已经对这种方法做了一些改进......
答案 1 :(得分:0)
如果您使用的是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;
}
答案 2 :(得分:0)
尝试此扩展程序
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>();
答案 3 :(得分:-1)
将它投射到动态?
var xele = new XElement("foo", "bar");
var p = (dynamic)xele;
Console.Write(p.Name);
或者你想达到什么目标?