C#でIDispatchExをエミュレートする
-
08-07-2019 - |
質問
C#3.0拡張メソッドは、ベースTypeに拡張機能を追加し、そのTypeのすべてのインスタンスでそのメソッドを呼び出すことを有効にします。
今、私が知っているJavaScriptは、特定のインスタンスにメソッドを追加できるIDispatchExを実装しています。
では、一連のメソッドをC#クラスの「インスタンス」に追加するにはどうすればよいですか?私はこれが動的言語と静的言語の聖戦領域であることを知っています。 :)私の意図はそれではないことを明確にしましょう。
インターフェイスを実装するクラスに応じて、イベントのセットをインターフェイスに追加できるようにしたいだけです。
ジェネリックを使用してそれを行うことができました
inteface ISample<T> { T SupportedEvents; }
class Sample : ISample<UIWidgetEvent> { }
class Sample2 : ISample<NonVisualUIWidget> { }
class UIWidgetEvent { public EventHandler Clicked; }
class NonVisualUIWidget {public EventHandler Expired;}
class TestSample
{
public void Test()
{
new Sample().SupportedEvents.Clicked += ...
new Sample2().SupportedEvents.Expired += ...
}
}
その後、 SupportedEvents
が好きではありませんでした
new Sample().Clicked +=...
それからJavaScriptを考えました( C#
は JS
ではないことを知っています:))...そして IDispatchEx
、 IL Weaving
、 Reflection.Emit
など。これを行う方法があるかもしれないと考えています... [設計時のサポートは素晴らしいと思いますが、なくても生きることができます]
はい、おそらくこの「インスタンス拡張」を行うことができます。訪問者パターンを使用します。 [シンタティックシュガーを入手できるかどうかわからない]
コメント?
解決
さて、「新規」のDynamicMethodインスタンスを作成できます。メソッドが、実行時に既存のインスタンスに静的にアタッチすることは、コンパイルできないという事実のために機能しません。
あなたはこれを試したことはないかもしれません(私はこれを試したことはありません)あなたが得ることができるように(多くのリフレクションとInvokeMemberの呼び出しが必要になると思います)
また、拡張メソッドを検討する価値があるかもしれません-拡張メソッドを介してイベントまたはイベントのようなメソッドをアタッチしようとしたことはありません...
最も見栄えの良い&quot; pure C#&quot;実装はおそらく、ジェネリック/インターフェースのセットアップですでに持っているものと非常によく似たものです...
正直なところ、真の「動的サポート」を備えたものを探しているならこのように、この種のことをDLR対応言語(IronPythonなど)で行い、C#のものから呼び出します。