代码之家  ›  专栏  ›  技术社区  ›  Matthew Scharley

在C#4.0中对DynamicObject进行子类化?

  •  0
  • Matthew Scharley  · 技术社区  · 16 年前

    我一直在测试VS 2010和C#4.0中的一些新东西,并一直在努力了解它的局限性,到目前为止,我喜欢我所看到的,但有一件事让我有点恼火。。。

    TryGetMember 直接)以避免铸造 dynamic ? 也许可以设置一些魔法属性 Test ?

    class DynamicPropertyObject : DynamicObject
    {
        private Dictionary<string, object> _properties = new Dictionary<string, object>();
    
        public override IEnumerable<string> GetDynamicMemberNames()
        {
            foreach (string s in _properties.Keys)
                yield return s;
        }
    
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            _properties[binder.Name] = value;
            return true;
        }
    
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;
            if (!_properties.ContainsKey(binder.Name))
                return false;
    
            result = _properties[binder.Name];
            return true;
        }
    }
    
    class Test : DynamicPropertyObject
    {
        public Test()
        {
            ((dynamic)this).Foo = "test";
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Cecil Has a Name    16 年前

    dynamic 以便编译器可以将属性访问转换为 TryGetMember

    编辑:

    由于.NET和C#并不完全是动态的,也不打算总是进行后期绑定(虚拟成员除外),因此有必要明确说明您需要动态键入。没有中间环节:静态类型的对象变量,当编译器在编译时找不到成员时,它充当动态类型的对象变量。

        2
  •  1
  •   Pavel Minaev    16 年前

    没有魔法属性可以强制类始终被视为 dynamic . 然而,如果你的问题是你特别想要它 this

    private dynamic DynThis { get { return this; } }
    

    用它来代替。

    推荐文章