3

DynamicProxy オブジェクトはIChangeProxyTargetインターフェイスを実装できることに気付きました。これにより、 のようなことが可能になります((IChangeProxyTarget)myProxyObj).ChangeInvocationTarget(newTarget)

DynamicProxy オブジェクトの mixin 実装を同様に変更する方法はありますか? 明らかに、これは私が完全には考えていない方法でターゲットを変更するよりも複雑でニュアンスがあります (さまざまなインターフェイスの実装、ミックスインの多様性などのため) が、その概念は完全に考えられないわけではありません。

または、それが欠けている場合、合理的にパフォーマンスの高い方法でこれを達成することに関するアイデアはありますか? 私はこれをハッキングすることに関していくつかの理論的な考えを持っていますが、それは非常に複雑に思えます:

  1. プロパティを使用して MixinSwitcher クラス (および付随する IMixinSwitcher インターフェイス) を定義しAction<object, object> DoSwitchます。
  2. DP オブジェクトを作成するときに this のインスタンスをミックスします。proxyGenerationOptions.AddMixinInstance(mixinSwitcher);
  3. DP オブジェクトを作成しますvar dpObj = proxyGenerator.Create...- 実装するインターフェイスに IMixinSwitcher が追加されていることを確認します
  4. リフレクションを使用して、関連する mixin MemberInfo を見つけますdpObj.Gettype()
  5. System.Reflection.Emit を使用して、このプロパティの高速セッターを生成します。
  6. 設定mixinSwitcher.DoSwitch = (SRE setter method here)
  7. ((IMixinSwitcher)dpObj).DoSwitch(dpObj, newMixinValue)
  8. 利益...または脳が溶けますか?

ステップ 1 クラスは、特定の/複数の実装をターゲットにできるように汎用化できます。ステップ 4 ~ 5 はパフォーマンスを向上させるためにキャッシュされ、一般的なステップ 1 の実装はクリーンアップされる可能性があります。

それでも、私はそれがかなり狂っていることを否定しません - より良い方法はありますか?

4

1 に答える 1

0

いいえ、それはサポートされていません。主な理由は、それが役立つ適切なシナリオを誰も思いつかなかったからです。あなたのシナリオは何ですか。mixinターゲットを交換できるようにしたいのはなぜですか?

于 2011-04-08T08:26:08.653 に答える