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

有帮助吗?

解决方案

无论您返回什么MetaObject(Bind),在这种情况下都会缓存并重新使用SetMember。你有两个动态网站做集。第一个调用会将结果缓存到L2缓存中,第二个站点将在请求您生成新规则之前将其获取。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top