在城堡.是否可以在初始化后改变mixin的值
本文关键字:改变 mixin 的值 城堡 是否 初始化 | 更新日期: 2023-09-27 17:49:31
我注意到DynamicProxy对象可以实现一个IChangeProxyTarget接口,它允许你做一些类似于((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)
的事情。
是否有一种方法可以类似地改变动态代理对象上的mixin实现?显然,这比我没有完全考虑过的改变目标的方式(由于不同的接口实现,混合的多样性等)更复杂和微妙,但这个概念并非完全不可想象。
或者缺少这一点,有什么想法来实现这一点,在一个合理的性能方式?我有一些关于黑客入侵的理论想法,但它似乎非常非常复杂:
- 定义一个MixinSwitcher类(和伴随的IMixinSwitcher接口)与
Action<object, object> DoSwitch
属性 - 在创建DP对象时混合一个实例。proxyGenerationOptions.AddMixinInstance (mixinSwitcher);
- 创建DP对象
var dpObj = proxyGenerator.Create...
-确保在接口上添加IMixinSwitcher来实现 - 使用反射on从
dpObj.Gettype()
中找到相关的mixin MemberInfo - 使用System.Reflection.Emit为这个属性生成一个快速设置器。
- 设置
mixinSwitcher.DoSwitch = (SRE setter method here)
- ((IMixinSwitcher) dpObj)。DoSwitch (dpObj newMixinValue)
- 利润……或者大脑融化?
步骤1类可以被泛化,以允许它针对特定/多个实现;步骤4-5被缓存以获得额外的性能,而一般的步骤1实现可以被清理。
即便如此,我也不否认这很疯狂——有更好的方法吗?
不,这是不支持的,主要是因为没有人想出一个好的场景,这将是有用的。你的设想是什么?为什么您希望能够交换mixin目标?