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

时间:2009-08-27 16:01:48

标签: c# c#-4.0

我一直在测试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 个答案:

答案 0 :(得分:2)

我怀疑你需要转换为dynamic,以便编译器可以将属性访问转换为TryGetMember类。

编辑:

由于.NET和C#不是完全动态的,也不是总是后期绑定(虚拟成员除外),因此有必要明确说明要进行动态类型操作。中间没有:静态类型的对象var,当编译器在编译时无法找到成员时,它充当动态类型。

答案 1 :(得分:1)

没有任何神奇的属性可以强迫某个类始终被视为dynamic。但是,如果您的问题特别针对类this,那么只需添加辅助属性:

private dynamic DynThis { get { return this; } }

并改为使用它。