コード内の任意の 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;
}
そうは言っても、私はすでにこのアプローチのいくつかの改善を考え出しています...
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;
}
この拡張機能を試してください
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>();
ダイナミックにキャストするだけですか?
var xele = new XElement("foo", "bar");
var p = (dynamic)xele;
Console.Write(p.Name);
または何を達成したいですか?