【问题标题】:IDynamicObject implementation ignores multiple property invocationsIDynamicObject 实现忽略多个属性调用
【发布时间】:2008-11-15 14:23:18
【问题描述】:

我在 C# 4 中实现了 IDynamicObject,返回一个自定义 MetaObject 子类,该子类执行简单的属性 getter/setter 分派到 Dictionary。不是火箭科学。

如果我这样做:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

然后 'Joe' 被打印到控制台...第二次调用 'Name' setter 永远不会被调用(永远不会进入我的自定义调度程序代码)。

我知道 DLR 会进行呼叫站点缓存,但我认为这不适用于此处。有谁知道怎么回事?

【问题讨论】:

  • 可能是因为它还是测试版???

标签: c#-4.0 dynamic-language-runtime idynamicobject


【解决方案1】:

在这种情况下,您从 (Bind)SetMember 返回的任何 MetaObject 都将被缓存并重新使用。你有 2 个动态站点做集合。第一次调用会将结果缓存在二级缓存中,第二个站点会在要求您生成新规则之前获取该缓存。

因此,无论您返回什么 MetaObject,都需要包含一个表达式树来更新值。例如,它应该执行以下操作:

返回新的元对象( Expression.AssignProperty(this.Expression, value.Expression), Restrictions.TypeRestriction(this.Expression, this.Value.GetType());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2016-09-06
    • 2013-09-14
    相关资源
    最近更新 更多