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