在Castle.DynamicProxy中,可以在初始化后更改mixin值吗?

时间:2011-04-08 01:57:19

标签: c# castle-dynamicproxy mixins

我注意到DynamicProxy对象可以实现IChangeProxyTarget接口,允许您执行((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)之类的操作。

有没有办法在DynamicProxy对象上类似地更改mixin实现?显然,这比我没有完全考虑过的方式更改目标更加复杂和微妙(由于不同的界面实现,混合的多样性等),但这个概念并非完全不可想象。

或者缺乏这个,以合理的方式实现这一点的任何想法?我有一些关于黑客攻击的理论观点,但它看起来非常非常复杂:

  1. 使用Action<object, object> DoSwitch属性
  2. 定义MixinSwitcher类(以及随附的IMixinSwitcher接口)
  3. 在创建DP对象时混合此实例.MixinSwitcher mixinSwitcher = new MixinSwitcher(); proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
  4. 创建DP对象var dpObj = proxyGenerator.Create... - 确保将IMixinSwitcher添加到接口中以实现
  5. 使用反射从dpObj.Gettype()
  6. 中查找相关的mixin MemberInfo
  7. 使用System.Reflection.Emit为此属性生成快速设置器。
  8. 设置mixinSwitcher.DoSwitch = (SRE setter method here)
  9. ((IMixinSwitcher)dpObj)。DoSwitch(dpObj,newMixinValue)
  10. 利润......还是大脑融化?
  11. 第1步类可以通用化,以允许它针对特定/多个实现;步骤4-5缓存以获得额外性能,并且可以清除一般步骤1的实现。

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

1 个答案:

答案 0 :(得分:0)

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