Frage

C # 3.0 Erweiterungsmethoden Erweiterungen des Basistyp machen fügen Sie diese Methode auf alle Aufruf Instanzen diese Art legal.

Nun JavaScript Ich weiß Arbeitsgeräte IDispatchEx durch welche ist es möglich, Methoden auf eine bestimmte Instanz hinzuzufügen.

Wie kann ich eine Reihe von Methoden, um eine ‚Instanz‘ einer C # Klasse hinzufügen? Ich weiß, das ist eine dynamische oder statische Sprachen heiligen Krieg Gebiet. :) mich, dass meine Absicht ist es nicht zulassen, klären.

Ich möchte nur in die Lage eine Reihe von Veranstaltungen, die eine Schnittstelle in Abhängigkeit von der Klasse hinzuzufügen, die eine Schnittstelle zu implementieren.

Ich war in der Lage zu tun, dass die Verwendung von 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 += ...
    }  
}  

Dann habe ich nicht wie SupportedEvents möchte ich sagen können,

new Sample().Clicked +=...

Dann dachte ich, JavaScript (ich weiß nicht C# ist JS:)) ... UND IDispatchEx, IL Weaving, Reflection.Emit etc. etc. und Gedanken können es eine Möglichkeit, dies zu tun ... [Entwurfszeit-Unterstützung wäre schön aber ich kann ohne leben]

Ja, ich könnte wahrscheinlich dieses „Beispiel Augmentation“ tun mit einem Besucher-Muster. [Nicht sicher, ob ich den syntaktischen Zucker bekommen kann, obwohl]

Kommentare?

War es hilfreich?

Lösung

Nun, könnten Sie eine Dynamic Instanz für Ihre „neue“ Methoden erstellen, aber statisch, sie zu einer vorhandenen Instanz zur Laufzeit angebracht wäre aufgrund der Tatsache nicht funktionieren es schlicht nicht kompilieren würde.

Sie Macht (ich habe nicht versucht) Lage sein, den OP-Codes in eine In-Memory-Baugruppe zu emittieren, aber das ist so weit weg von „syntaktisch süß“ zu sein, wie Sie bekommen können ( bedeuten würde viel Reflexion und InvokeMember nennt, würde ich denken)

Es könnte auch ein Blick wert sein in Erweiterungsmethoden -. Obwohl ich habe nie versucht, Ereignisse oder Ereignisähnlichen Methoden über Erweiterungsmethoden Befestigung ... und sie sind 3.5 nur, damit Sie einschränken

Die schönsten suchen, „reine C #“ Implementierung ist wahrscheinlich etwas sehr ähnlich zu dem, was du schon hast mit dem generic / Interface-Setup ...

Ehrlich gesagt, wenn Sie nach etwas mit true „dynamischer Unterstützung“ so aussehen, würde ich diese Art von Sachen in einer DLR-fähigen Sprache tun (wie Ironpython) und rufe in es von Ihrem C # Zeug.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top