3

我注意到 DynamicProxy 对象可以实现一个IChangeProxyTarget接口,它允许您执行类似((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget).

有没有办法类似地更改 DynamicProxy 对象上的 mixin 实现?显然,这比以我没有完全考虑过的方式更改目标更复杂和细致入微(由于不同的接口实现、mixins 的多样性等),但这个概念并非完全不可想象。

或者缺乏这一点,以合理的性能方式实现这一目标的任何想法?我有一些关于破解这个的理论想法,但它似乎非常非常复杂:

  1. Action<object, object> DoSwitch定义一个带有属性的 MixinSwitcher 类(以及随附的 IMixinSwitcher 接口)
  2. 在创建 DP 对象 `MixinSwitcher mixinSwitcher = new MixinSwitcher(); 时混合这个实例 proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
  3. 创建 DP 对象var dpObj = proxyGenerator.Create...- 确保将 IMixinSwitcher 添加到接口以实现
  4. 使用反射从查找相关的 mixin MemberInfodpObj.Gettype()
  5. 使用 System.Reflection.Emit 为该属性生成一个快速设置器。
  6. mixinSwitcher.DoSwitch = (SRE setter method here)
  7. ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
  8. 利润……还是大脑融化?

可以对第 1 步类进行泛化以允许它针对特定/多个实现;缓存步骤 4-5 以获得额外的性能,并且可以清理一般的步骤 1 实现。

即便如此,我也不否认这很疯狂——还有更好的方法吗?

4

1 回答 1

0

不,这不受支持,主要是因为没有人想出一个有用的好方案。你的场景是什么。为什么你希望能够交换 mixin 目标?

于 2011-04-08T08:26:08.653 回答