首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能索引到一个ExpandoObject?

为什么我不能索引到一个ExpandoObject?
EN

Stack Overflow用户
提问于 2014-11-06 19:38:16
回答 2查看 15.1K关注 0票数 49

今天,当我研究C#动态时,有些东西让我大吃一惊(我从来没有经常用过它们,但最近我一直在试验Nancy web框架)。我发现我不能这样做:

代码语言:javascript
复制
dynamic expando = new ExpandoObject();

expando.name = "John";

Console.WriteLine(expando["name"]);

最后一行抛出一个异常:

不能对类型为'System.Dynamic.ExpandoObject‘的表达式应用带有[]的索引

我理解错误消息,但我不明白为什么会发生这种情况。我看过ExpandoObject的文档,它显式地实现了IDictionary<,>,因此有一个this.[index]方法(MSDN。为什么我不能叫它?

当然,没有什么可以阻止我手动将ExpandoObject转换为字典,然后对其进行索引,但这有点不切实际;它也没有解释Expando是如何隐藏其接口之一的方法的。

这里发生了什么事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 19:41:52

Expando是如何隐藏它的一个接口的方法的。

因为正如您在文档中正确发现的那样,indexer isexplicit interface implementation。来自Explicit Interface Implementation Tutorial

实现接口的类可以显式实现该接口的成员。显式实现成员时,不能通过类实例访问该成员,只能通过接口的实例访问。

这意味着您必须强制转换对接口的引用才能访问它:

代码语言:javascript
复制
((IDictionary<String, Object>)expando)["name"]
票数 68
EN

Stack Overflow用户

发布于 2020-06-15 03:44:40

使用这个工厂类来创建ExpandoObjects!然后使用HasProperty(“道具名称”)或GetValue(“道具名称”)

代码语言:javascript
复制
void Main()
{
    dynamic _obj = ExpandoObjectFactory.Create();
    if (_obj.HasProperty("Foo") == false)
    {
        _obj.Foo = "Foo";
    }
    Console.WriteLine(_obj); // Foo;
    object bar = _obj.GetValue("Bar");
    Console.WriteLine(bar); // null
}

public static class ExpandoObjectFactory
{
    public static ExpandoObject Create()
    {
        dynamic expandoObject = new ExpandoObject();
        expandoObject.HasProperty = new Func<string, bool>((string name) => ((IDictionary<string, object>)expandoObject).ContainsKey(name));
        expandoObject.GetValue = new Func<string, object>(delegate (string name)
        {
            ((IDictionary<string, object>)expandoObject).TryGetValue(name, out object value);
            return value;
        });
        return expandoObject;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26778554

复制
相关文章

相似问题

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