【发布时间】:2011-08-01 04:04:55
【问题描述】:
我注意到 DynamicProxy 对象可以实现IChangeProxyTarget 接口,它允许您执行类似((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget) 的操作。
有没有办法类似地更改 DynamicProxy 对象上的 mixin 实现?显然,这比以我尚未完全考虑过的方式更改目标更复杂和细致入微(由于不同的接口实现、混入的多样性等),但这个概念并非完全不可想象。
或者缺乏这个,关于以合理的性能方式实现这一点的任何想法?我有一些关于破解这个的理论想法,但看起来非常非常复杂:
- 使用
Action<object, object> DoSwitch属性定义一个 MixinSwitcher 类(以及随附的 IMixinSwitcher 接口) - 在创建 DP 对象时混合 this 的一个实例 `MixinSwitcher mixinSwitcher = new MixinSwitcher(); proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
- 创建DP对象
var dpObj = proxyGenerator.Create...- 确保将IMixinSwitcher添加到要实现的接口中 - 使用反射从
dpObj.Gettype()找到相关的mixin MemberInfo - 使用 System.Reflection.Emit 为该属性生成一个快速设置器。
- 设置
mixinSwitcher.DoSwitch = (SRE setter method here) - ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
- 利润……还是脑筋急转弯?
第 1 步类可以通用化,以允许它针对特定/多个实现;缓存第 4-5 步以获得额外性能,并且可以清理一般的第 1 步实现。
即便如此我也不否认这很疯狂——还有更好的方法吗?
【问题讨论】:
标签: c# castle-dynamicproxy mixins