.NET 3.5 DLR 动态对象帮助

3

我一直在努力让.NET 3.5中的简单DynamicObject示例正常工作。

使用最新版的DLR off codeplex,我无法弄清楚以下内容在.NET 3.5中的等效物是什么:

public class DynamicObjectBag : DynamicObject
{
    private Dictionary<string, object> _properties = new Dictionary<string, object>();
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return _properties.TryGetValue(binder.Name, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _properties[binder.Name] = value;
        return true;
    }
}

dynamic foo = new DynamicObjectBag();
foo.Val1 = 3;
foo.Val2 = “Value 2”;

当然,这只是一个简单的例子。我计划从DynamicObject派生类,以便我能够使用直接对象属性和存储在字典中的属性,使用相同的语义点样式表示法或访问方法。目标是拥有DLR兼容的对象,以在DLR支持的语言中使用,并为将来升级到.NET 4.0时提供兼容性。
我的问题是,在.NET 4.0之前,我没有与动态关键字等价的概念。像TryGetMember这样的方法具有绑定器参数,例如GetMemberBinder。现在,.NET 4.0有一个可用的C#默认绑定器,它将允许在使用动态关键字时进行绑定,但是我无法找到或确定如何在.NET 3.5中执行等效操作。
目前,我了解到我需要编写一个自定义绑定器,该绑定器基本上复制了.NET 4.0默认C#绑定器中可用的逻辑类型。请有经验的人指导我如何在没有访问动态关键字的情况下在.NET 3.5中使用DynamicObject并在运行时添加属性等。
参考文献:
Dynamically adding members to a dynamic object
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

1个回答

2

您需要创建一个自定义绑定器,并且可能希望使用CallSite来消耗绑定器,以便操作被缓存。

您可以在外层使用DefaultBinder来完成大部分工作 - 您只需要创建一个DefaultBinder,然后它就有像GetMember这样的方法来进行绑定。然后,您的绑定器的实现只是使用DefaultBinder并应用返回的任何值类型的装箱规则(DLR要求所有返回类型为对象)。


这是我的当前想法。我希望有一些秘密的忍者技巧,让我不必编写自定义绑定器和调用站点,因为在.NET 4.0中可以使用这种类型的行为。 - Firestrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接