【问题标题】:In Castle.DynamicProxy is it possible to change a mixin value after initialisation?在 Castle.DynamicProxy 中是否可以在初始化后更改 mixin 值?
【发布时间】:2011-08-01 04:04:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# castle-dynamicproxy mixins


    【解决方案1】:

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

    【讨论】:

    • 基本上我在看我是否可以persist a mixin object with nhibernate 并想知道我是否可以,如果我使用 GetEntity 拦截器构建对象(使用虚拟混合值),然后用适当的值切换它们当对象被 PostLoaded 时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2022-08-14
    • 2021-09-21
    相关资源
    最近更新 更多