我在C#4中实现了IDynamicObject,返回一个自定义的MetaObject子类,它将简单的属性getter / setter dispatch转换为Dictionary。不是火箭科学。
如果我这样做:
dynamic foo = new DynamicFoo();
foo.Name = "Joe";
foo.Name = "Fred";
Console.WriteLine(foo.Name);
然后'Joe'被打印到控制台......永远不会调用对'Name'设置器的第二次调用(根本不会进入我的自定义调度程序代码)。
我知道DLR会进行呼叫缓存,但我认为这不适用于此。有谁知道发生了什么事?
答案 0 :(得分:3)
无论您返回什么MetaObject(Bind),在这种情况下都会缓存并重新使用SetMember。你有两个动态网站做集。第一个调用会将结果缓存到L2缓存中,第二个站点将在请求您生成新规则之前将其获取。
因此,无论您返回的MetaObject需要包含将更新值的表达式树。例如,它应该执行以下操作:
返回新的MetaObject( Expression.AssignProperty(this.Expression,value.Expression), Restrictions.TypeRestriction(this.Expression,this.Value.GetType());