0

我有兴趣将Expando接口实现为一种访问非 Expando 格式的复杂数据的方法。我希望有类似 expando 的动态访问,而不需要重新格式化为 Expando 对象。

那么,您如何实施IDynamicMetaObjectProvider

这是一个基本ExpandoObject定义:

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

2 回答 2

3

这是链接:Implementing Dynamic Interfaces有一个示例(在这里重新发布的方式很大......)

于 2012-06-20T05:52:20.133 回答
1

因此,既然您提出了要求,这里有一个未经测试的示例,将索引器添加到此处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是成员名单。这些名称是不言自明的,您可以看到您可以对对象执行的所有操作都可以被覆盖。

于 2012-06-20T09:36:58.737 回答