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

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 に答える
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 に答える
-1

ダイナミックにキャストするだけですか?

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

または何を達成したいですか?

于 2012-08-31T09:48:07.433 に答える