Frage

Damit meine ich nicht dynamisches Casting im Sinne eine untere Grenzfläche oder Basisklasse zu einer abgeleiteten Klasse Gießen, ich meine eine Schnittstellendefinition nehmen, die ich angelegt habe, und dann nicht ein anderes Objekt zu dieser Schnittstelle dynamisch Gießen abgeleitet von dieser Schnittstelle unterstützt aber alle Anrufe.

Beispiel:

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = (dynamic<IMyInterface>)myTextBox;

Dies könnte bei der Kompilierung für bekannte Arten erreicht werden, und Laufzeit für Instanzen mit dynamischem erklärt. Die Schnittstellendefinition ist bekannt, wie die Art (in diesem Beispiel) ist damit der Compiler kann bestimmen, ob das Objekt die Anrufe unterstützt durch die Schnittstelle definiert und etwas Magie führt für uns die Besetzung haben.

Meine Vermutung ist, dass dies nicht in C # unterstützt wird 4 (ich war nicht in der Lage einen Verweis darauf zu finden), aber ich mag sicher wissen. Und wenn dies nicht der Fall, würde ich zu diskutieren, wie wenn es sollte in einer zukünftigen Variante der Sprache oder nicht, und die Gründe für und gegen einbezogen werden. Für mich scheint es wie eine schöne Ergänzung zu ermöglichen größeren Polymorphismus in Code ohne ganz neue Typen zu erstellen, die Rahmentypen wickeln bestehenden.

Aktualisieren
Aus Furcht, dass jemand mir das Plagiats beschuldigen, ich war nicht bewusst, Jon Skeet bereits diese vorgeschlagen zu haben. Aber schön, dass wir wissen, dachte der überaus ähnliche Syntax, die es intuitiv sein könnte zumindest vermuten lässt. Inzwischen „haben eine originelle Idee“, bleibt auf meiner Eimer-Liste für einen anderen Tag.

War es hilfreich?

Lösung

ich glaube, Jon Skeet hatte einen solchen Vorschlag ( http://msmvps.com/blogs/jon_skeet/archive/2008/10/30/c-4-0-dynamic-lt-t-gt.aspx ), aber bisher habe ich nicht gehört, dass C # 4.0 es haben wird.

Andere Tipps

Ich denke, das ist problematisch. Sie sind die Einführung Kopplung zwischen zwei Klassen, die nicht gekoppelt sind.

Betrachten Sie den folgenden Code ein.

public interface IFoo
{
   int MethodA();
   int MethodB();
}

public class Bar
{
   int MethodA();
   int MethodB();
}

public class SomeClass
{
   int MethodFoo(IFoo someFoo);
}

sollte dies dann legal sein?

int blah = someClass.MethodFoo((dynamic<IFoo>)bar);

Es scheint wie es legal sein sollte, weil der Compiler in der Lage sein sollte dynamisch bar als etwas zu geben, die IFoo implementiert.

Doch an diesem Punkt, den Sie koppeln IFoo und Bar durch einen Aufruf in einem völlig separaten Teil des Codes.

Wenn Sie Bar bearbeiten, da es nicht mehr MethodB braucht, plötzlich someClass.MethodFood funktioniert nicht mehr, obwohl Bar und IFoo sind nicht verwandt.

In der gleichen Weise, wenn Sie MethodC (), um IFoo hinzufügen, würde der Code wieder brechen, obwohl IFoo und Bar sind angeblich nicht verwandt.

Die Tatsache ist, obwohl dies in bestimmten Fällen sinnvoll sein würde, wo es Ähnlichkeiten zwischen Objekten, die Sie nicht kontrollieren, gibt es einen Grund, die Schnittstellen explizit an Objekten angebracht werden, und der Grund ist, so dass der Compiler kann garantieren, dass das Objekt implementiert es.

Es gibt keine Notwendigkeit für C #, dies zu unterstützen, da es sehr sauber als Bibliothek implementiert werden kann.

Ich habe drei oder vier getrennte Implementierungen gesehen (begann ich mir ein Schreiben, bevor ich sie gefunden). Hier ist die gründlichste Behandlung, die ich je gesehen habe:

http://bartdesmet.net/blogs/bart/archive/2008/11/10/introducing-the-c-ducktaper-bridging-the-dynamic-world-with-the -static-world.aspx

Es wird wahrscheinlich noch einfacher zu implementieren sein, sobald das DLR in die Runtime integriert ist.

Da der Wrapper / Spediteur-Klasse für eine bestimmte Schnittstelle erzeugt einmal werden kann und dann zwischengespeichert und dann ein bestimmtes Objekt unbekannter Art kann einmal gewickelt wird, gibt es eine Menge Spielraum für das Caching von Call-Site, etc., so der Leistung sollte ausgezeichnet sein.

Im Gegensatz dazu glaube ich, das dynamic Schlüsselwort, das eine Sprache-Funktion ist, und ein äußerst komplex, ist eine unnötige und potentiell katastrophale Abschweifung, Schuh-gehörnte in eine Sprache, die eine sehr klare statische Typisierung Philosophie vorher hatte, die gab es offensichtlich, dass die Richtung für zukünftige Verbesserungen. Sie sollten haben, dass stecken und machte die Typinferenz besser arbeiten und besser bis Typisierung mehr unsichtbar geworden ist. Es gibt so viele Bereiche, in denen sie die Sprache entwickeln könnte, ohne die bestehenden Programme zu brechen, und doch sind sie es nicht tun, einfach aufgrund mangelnder Ressourcen (zB der Grund var nicht an mehr Orten verwendet werden kann, ist, weil sie die neu zu schreiben würde Compiler und sie haben keine Zeit).

Sie sind immer noch gute Sachen in C # 4.0 zu tun (die Varianz bietet), aber es gibt so viel anderes, das zu tun, könnte die Art System intelligenter, automatische, leistungsfähiger bei der Erkennung Probleme bei der Kompilierung zu machen. Stattdessen sind wir im Wesentlichen ein Gimmick zu bekommen.

Die Open-Source-Framework Impromptu-Interface dies die C # 4 und die dlr nicht mit .

using ImpromptuInterface;

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = myTextBox.ActLike<IMyInterface>();

Da es das DLR nutzt es wird auch mit ExpandoObject und Dynamic arbeiten.

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