DynamicProxy オブジェクトはIChangeProxyTargetインターフェイスを実装できることに気付きました。これにより、 のようなことが可能になります((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)
。
DynamicProxy オブジェクトの mixin 実装を同様に変更する方法はありますか? 明らかに、これは私が完全には考えていない方法でターゲットを変更するよりも複雑でニュアンスがあります (さまざまなインターフェイスの実装、ミックスインの多様性などのため) が、その概念は完全に考えられないわけではありません。
または、それが欠けている場合、合理的にパフォーマンスの高い方法でこれを達成することに関するアイデアはありますか? 私はこれをハッキングすることに関していくつかの理論的な考えを持っていますが、それは非常に複雑に思えます:
- プロパティを使用して MixinSwitcher クラス (および付随する IMixinSwitcher インターフェイス) を定義し
Action<object, object> DoSwitch
ます。 - DP オブジェクトを作成するときに this のインスタンスをミックスします。proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
- DP オブジェクトを作成します
var dpObj = proxyGenerator.Create...
- 実装するインターフェイスに IMixinSwitcher が追加されていることを確認します - リフレクションを使用して、関連する mixin MemberInfo を見つけます
dpObj.Gettype()
- System.Reflection.Emit を使用して、このプロパティの高速セッターを生成します。
- 設定
mixinSwitcher.DoSwitch = (SRE setter method here)
- ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
- 利益...または脳が溶けますか?
ステップ 1 クラスは、特定の/複数の実装をターゲットにできるように汎用化できます。ステップ 4 ~ 5 はパフォーマンスを向上させるためにキャッシュされ、一般的なステップ 1 の実装はクリーンアップされる可能性があります。
それでも、私はそれがかなり狂っていることを否定しません - より良い方法はありますか?