0

C#3.0拡張メソッドは、基本Typeに拡張機能を追加し、そのTypeのすべてのインスタンスでそのメソッドを呼び出すことを有効にします。

今、私が知っているJavaScriptは、特定のインスタンスにメソッドを追加できるIDispatchExを実装しています。

では、C#クラスの「インスタンス」に一連のメソッドを追加するにはどうすればよいですか?私はこれが動的言語と静的言語の聖戦の領土であることを知っています。:)私の意図はそれではないことを明確にさせてください。

インターフェイスを実装するクラスに応じて、一連のイベントをインターフェイスに追加できるようにしたいだけです。

Genericsを使用してそれを行うことができました

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ます:))... AND、、IDispatchExなどなどを考えIL WeavingReflection.Emitこれを行う方法があるかもしれないと思いました... [設計時のサポートは素晴らしいですが、私はなくても生きることができます]

はい、おそらくビジターパターンでこの「インスタンス拡張」を行うことができます。[糖衣構文を入手できるかどうかはわかりませんが]

コメント?

4

1 に答える 1

2

「新しい」メソッドの DynamicMethod インスタンスを作成することはできますが、実行時にそれらを既存のインスタンスに静的にアタッチすることは、単純にコンパイルできないという事実のために機能しません。

(私はこれを試したことはありません) オペコードをインメモリ アセンブリに発行できるかもしれませんが、それは「構文的に甘い」ものとはほど遠いものです (多くのリフレクションと InvokeMember 呼び出しが必要になるため、と思うだろう)

拡張メソッドを調べることも価値があるかもしれません-拡張メソッドを介してイベントまたはイベントのようなメソッドを添付しようとしたことはありません...そしてそれらは3.5のみであるため、制限される可能性があります。

最も見栄えの良い「純粋な C#」実装は、おそらく、ジェネリック/インターフェイスのセットアップで既に得ているものと非常によく似たものです...

正直なところ、このような真の「動的サポート」を備えたものを探している場合は、DLR 対応の言語 (IronPython など) でこの種のことを行い、C# のものから呼び出します。

于 2008-12-23T21:05:03.010 に答える