假冒膨胀机

时间:2012-06-20 05:45:29

标签: c# .net dynamic

我有兴趣实现Expando接口作为访问非Expando格式的复杂数据的方法。我想要具有类似expando的动态访问,而无需重新格式化为Expando对象。

那么,您如何实施IDynamicMetaObjectProvider

这是一个基本的ExpandoObject定义:

ExpandoObject : IDynamicMetaObjectProvider
, IDictionary<string, object>
, ICollection<KeyValuePair<string, object>>
, IEnumerable<KeyValuePair<string, object>>
, IEnumerable
, INotifyPropertyChanged

2 个答案:

答案 0 :(得分:3)

以下是链接:Implementing Dynamic Interfaces,其中包含一个示例(此处重新发布的方式...)

答案 1 :(得分:1)

所以,既然你提出了这个问题,这里有一个未经测试的例子,即为XElement描述的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; } } 动态包装器添加索引器(我在这台机器上没有.Net 4,所以请指出任何错误):

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。它允许人们在期望底层类型的地方使用动态包装器 - 这使整个事情变得非常棒。

最后,here {{1}}成员列表。名称是不言自明的,你可以看到你可以覆盖对象所做的一切。