首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪造Expando

伪造Expando
EN

Stack Overflow用户
提问于 2012-06-20 13:45:29
回答 2查看 275关注 0票数 0

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

那么,如何实现IDynamicMetaObjectProvider呢?

这是一个基本的ExpandoObject定义:

代码语言:javascript
复制
ExpandoObject : IDynamicMetaObjectProvider
, IDictionary<string, object>
, ICollection<KeyValuePair<string, object>>
, IEnumerable<KeyValuePair<string, object>>
, IEnumerable
, INotifyPropertyChanged
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-20 17:36:59

因此,既然您提出了请求,下面是一个未经测试的示例,它将索引器添加到描述hereXElement动态包装器中(我在这台机器上没有.Net 4,所以请指出任何错误):

代码语言:javascript
复制
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;
    }
}

现在您应该能够做到这一点(还可以使用链接中定义的其他方法):

代码语言:javascript
复制
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";

生产

代码语言:javascript
复制
<Contact type="business">
    <Name>Patrick Hines</Name>
    <Address street="123 Main St" city="Mercer Island" state="WA" postal="68402" />
</Contact>

还可以查看示例中的TryConvert。它允许人们在需要底层类型的地方使用动态包装器--这使得整个事情变得非常棒。

最后,对DynamicObject成员列表执行here's操作。这些名称是不言而喻的,您可以看到,几乎所有可以对对象执行的操作都可以被覆盖。

票数 1
EN

Stack Overflow用户

发布于 2012-06-20 13:52:20

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11113478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档