Я заметил, что объекты DynamicProxy могут реализовывать интерфейс IChangeProxyTarget , который позволяет вам делать что-то вроде ((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)
.
Есть ли способ аналогичным образом изменить реализацию mixin в DynamicProxyобъект?Очевидно, что это более сложный и нюанс, чем изменение цели способами, которые я до конца не продумал (из-за различных реализаций интерфейса, множественности миксинов и т. Д.), Но концепция не является полностью немыслимой.
идеи относительно достижения этого, довольно производительным способом?У меня есть некоторые теоретические идеи относительно взлома этого, но это кажется чрезвычайно, чрезвычайно запутанным:
- Определите класс MixinSwitcher (и сопутствующий интерфейс IMixinSwitcher) с
Action<object, object> DoSwitch
свойство - Mix экземпляроб этом при создании объекта DP `MixinSwitcher mixinSwitcher = new MixinSwitcher ();proxyGenerationOptions.AddMixinInstance (mixinSwitcher);
- Создать объект DP
var dpObj = proxyGenerator.Create...
- убедитесь, что IMixinSwitcher добавлен к интерфейсам для реализации - Используйте отражение для поиска соответствующего mixin MemberInfo из
dpObj.Gettype()
- Используйте System.Reflection.Emit для создания быстрого установщика для этого свойства.
- Set
mixinSwitcher.DoSwitch = (SRE setter method here)
- ((IMixinSwitcher) dpObj) .DoSwitch (dpObj, newMixinValue)
- Прибыль ... или расплавление мозга?
Класс шага 1 может быть обобщен, чтобы позволить ему нацеливаться на конкретные / множественные реализации;шаги 4-5 кэшированы для дополнительной производительности, и общая реализация шага 1 может быть очищена.
Даже если я не отрицаю, это довольно безумно - есть ли лучший способ?