В Castle.DynamicProxy можно ли изменить значение mixin после инициализации? - PullRequest
3 голосов
/ 08 апреля 2011

Я заметил, что объекты DynamicProxy могут реализовывать интерфейс IChangeProxyTarget , который позволяет вам делать что-то вроде ((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget).

Есть ли способ аналогичным образом изменить реализацию mixin в DynamicProxyобъект?Очевидно, что это более сложный и нюанс, чем изменение цели способами, которые я до конца не продумал (из-за различных реализаций интерфейса, множественности миксинов и т. Д.), Но концепция не является полностью немыслимой.

идеи относительно достижения этого, довольно производительным способом?У меня есть некоторые теоретические идеи относительно взлома этого, но это кажется чрезвычайно, чрезвычайно запутанным:

  1. Определите класс MixinSwitcher (и сопутствующий интерфейс IMixinSwitcher) с Action<object, object> DoSwitch свойство
  2. Mix экземпляроб этом при создании объекта DP `MixinSwitcher mixinSwitcher = new MixinSwitcher ();proxyGenerationOptions.AddMixinInstance (mixinSwitcher);
  3. Создать объект DP var dpObj = proxyGenerator.Create... - убедитесь, что IMixinSwitcher добавлен к интерфейсам для реализации
  4. Используйте отражение для поиска соответствующего mixin MemberInfo из dpObj.Gettype()
  5. Используйте System.Reflection.Emit для создания быстрого установщика для этого свойства.
  6. Set mixinSwitcher.DoSwitch = (SRE setter method here)
  7. ((IMixinSwitcher) dpObj) .DoSwitch (dpObj, newMixinValue)
  8. Прибыль ... или расплавление мозга?

Класс шага 1 может быть обобщен, чтобы позволить ему нацеливаться на конкретные / множественные реализации;шаги 4-5 кэшированы для дополнительной производительности, и общая реализация шага 1 может быть очищена.

Даже если я не отрицаю, это довольно безумно - есть ли лучший способ?

1 Ответ

0 голосов
/ 08 апреля 2011

Нет, это не поддерживается, в основном потому, что никто не придумал хороший сценарий, где это было бы полезно. Каков твой сценарий? Почему вы хотите иметь возможность менять мишени в миксине?

...