0

我在 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 会进行呼叫站点缓存,但我认为这不适用于这里。有谁知道发生了什么?

4

1 回答 1

3

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

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

return new MetaObject( Expression.AssignProperty(this.Expression, value.Expression), Restrictions.TypeRestriction(this.Expression, this.Value.GetType());

于 2008-11-15T17:29:52.717 回答