【问题标题】:.Net 3.5 DLR DynamicObject Help.Net 3.5 DLR 动态对象帮助
【发布时间】:2011-01-21 04:23:16
【问题描述】:

我一直在努力获得一个在 .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 DLR 功能的未来兼容性。

我的问题是,在 .NET 4.0 之前,我没有与 dynamic 关键字等效的概念。 TryGetMember 等方法有一个类似 GetMemberBinder 的 binder 参数。现在 .NET 4.0 有一个可用的 C# 默认绑定器,它允许在使用 dynamic 关键字时进行绑定,但是我无法找到或确定如何在 .NET 3.5 中执行等效操作。

目前我的理解是,我需要编写一个自定义绑定器,它基本上会复制 .NET 4.0 默认 C# 绑定器中可用的逻辑类型。

请有人指出我如何在 .NET 3.5 中使用 DynamicObject 并在运行时添加属性等,而无需访问 dynamic 关键字。

参考资料:
Dynamically adding members to a dynamic object
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

【问题讨论】:

    标签: c# .net .net-3.5 dynamic dynamic-language-runtime


    【解决方案1】:

    您需要创建一个自定义活页夹,然后您可能希望使用 CallSite 使用活页夹,以便缓存操作。

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

    【讨论】:

    • 那是我目前的想法很好。我希望有一些我错过的秘密忍者动作,所以我不必编写自定义活页夹和调用站点,因为这种行为在 .NET 4.0 中可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2012-11-16
    • 2011-08-04
    • 2011-01-25
    相关资源
    最近更新 更多