それで、あなたがそれを要求したので、ここXElement
で説明するために動的ラッパーにインデクサーを追加するテストされていない例があります(私はこのマシンに.Net 4を持っていないので、エラーを指摘してください):
public class DynamicXMLNode : DynamicObject
{
XElement node;
//all the other stuff necessary...
public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
{
string name = (string)indexes[0];
result = node.Attribute(name); //maybe check for null here
return true;
}
public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
{
string name = (string)indexes[0];
node.SetAttributeValue(name, value);
return true;
}
}
これで、これを実行できるようになります(リンクで定義されている他のメソッドも使用)。
dynamic contact = new DynamicXMLNode("Contact");
contact["type"] = "business";
contact.Name = "Patrick Hines";
contact.Address = new DynamicXMLNode(); // I think it should even work without this line. Can anybody confirm this?
contact.Address["street"] = "123 Main St";
contact.Address["city"] = "Mercer Island";
contact.Address["state"] = "WA";
contact.Address["postal"] = "68402";
生産
<Contact type="business">
<Name>Patrick Hines</Name>
<Address street="123 Main St" city="Mercer Island" state="WA" postal="68402" />
</Contact>
例もご覧くださいTryConvert
。これにより、基になる型が期待される場所で動的ラッパーを使用できるようになります。これにより、全体が完全に素晴らしいものになります。
最後に、これがメンバーのリストです。DynamicObject
名前は非常にわかりやすく、オブジェクトで実行できるほとんどすべてをオーバーライドできることがわかります。