0

我希望能够在代码中采用任何 XElement,并将其作为动态模型直接放入 Razor 视图中。

无论 XElement 的内容如何,​​如何自动将 XElement 解析为动态对象?

4

4 回答 4

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;

    }

也就是说,我已经对这种方法进行了一些改进......

于 2012-08-31T10:47:56.917 回答
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>();
于 2015-04-08T06:48:50.953 回答
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;
}
于 2012-08-31T10:05:15.163 回答
-1

只是将其转换为动态?

var xele = new XElement("foo", "bar");
    var p = (dynamic)xele;
    Console.Write(p.Name);

或者你想达到什么目的?

于 2012-08-31T09:48:07.433 回答