我一直在努力让一个简单的DynamicObject示例在.NET 3.5中运行。
使用最新版本的DLR关闭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功能的兼容性。
我的问题是pre -.NET 4.0我没有与dynamic关键字相同的概念。 TryGetMember等方法有一个像GetMemberBinder这样的binder参数。现在,.NET 4.0有一个C#默认绑定器,它允许在使用dynamic关键字时发生绑定,但是我无法找到或确定如何在.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/
答案 0 :(得分:2)
您需要创建一个自定义活页夹,然后您可能希望使用CallSite使用活页夹,以便缓存操作。
您可以使用外层中的DefaultBinder来完成大部分操作 - 您只需创建一个,然后在其上使用GetMember等方法来进行绑定。然后,您的绑定器的实现只是使用DefaultBinder并应用任何返回的装箱值类型的规则(DLR要求所有返回类型都是对象)。