Frage

Ich bin die Erforschung zur Zeit die 2. Ausgabe von C # in der Tiefe, und zu versuchen, „dynamischen Protokollpuffer“ zu implementieren - das heißt ein Niveau dynamischer Unterstützung auf meiner vorhandenen Protokollpuffer Bibliothek. Als solche habe ich eine DlrMessage Typ von DynamicObject abgeleitet. Nach ein wenig herumgespielt habe ich es geschafft, um es mit bemerkenswert wenig Code auf einfache Eigenschaften zu reagieren, aber ich möchte viel weiter gehen -. Und verstehen wirklich, was los ist

Bisher habe ich keine guten Erklärungen des DLR gefunden - und viele der Blog-Posts sind effektiv jetzt veraltet, wie die Dinge geändert haben (ich glaube) zwischen dem früheren CTP und .NET 4.0 Beta 1. die MSDN-Dokumentation für Dynamic ist ziemlich minimal im Moment.

Meine unmittelbarste Abfrage ist, ob es eine einfache Möglichkeit, zu sagen: „Verwenden Reflexion Anrufe binden ich nicht umgehen kann, dieses besondere Objekt.“ (Mit anderen Worten, ich möchte die bestehende Reflexion erweitern Bindung anstatt selbst zu tun alles, wenn möglich.) Leider bin ich nicht sehr weit von Mutmaßungen zu bekommen.

Gibt es definitive und aktuelle Quellen der Dokumentation soll ich das wissen? Ich bin mir bewusst, dass ein Teil über eine neue Technologie des Schreibens ist Exploration, sondern eine helfende Hand würde geschätzt:)

War es hilfreich?

Lösung

Beste Quelle habe ich gefunden und gelesen ist häufig die letzten Jahre im Wert von Chris Burrow Beiträge auf seinem Blog .

Es gibt auch die das ist ausgeschaltet Haupt DLR rel="noreferrer">

Andere Tipps

In der Standardeinstellung Dynamic wird sagen: „Rückfall auf Reflexion“, wenn Ihr Try * Funktionen false zurück. So können Sie bereits können Eigenschaften / Felder / Methoden, um Ihre Unterklasse erben und hinzufügen, die alle durch Reflexion behandelt werden, wenn der dynamische Pfad nicht die Lookup macht.

Möchten Sie mehr in die Tiefe möchten Sie vielleicht bei IDynamicMetaObjectProvider suchen. An dieser unteren Ebene so, wie Sie zum Nachdenken Rückfall sagen ist den Fallback * Methode auf dem eingehenden DynamicMetaObjetBinder zu nennen. Dies läßt dann die anrufende Sprache, um die Auflösung zu liefern. Sie können dann diesen AST zurückkehren oder es in einen größeren AST komponieren Whcih Sie zurückkommen. Grundsätzlich Fallback * können Sie den AST erhalten, die die anrufende Sprache erzeugen würde, die richtigen Fehler einschließlich (Ausnahme, undefined in JS, etc ...).

Die Art und Weise Dynamic den Rückfall auf Reflexion tut, ist, dass es tatsächlich das Bindemittel des Fallback * Methode zweimal aufruft. Das erste Mal, fällt es ohne „errorSuggestion“ Parameter zurück. Dies wird entweder den Fehler oder den AST, die Reflexion gebaut wurde mit. Es erzeugt dann einen AST, das so etwas wie lautet:

if(TryGetMember("name", out value)) {
   return value;
} else {
   return resultOffallback;
}

Es dauert dann diesen AST kombiniert und gibt es tatsächlich in als Fehler Vorschlag für das Bindemittel auf einem zweiten Rückfall. Das Bindemittel sollte dann dieses errorSuggestion respektieren, wenn die Bindung nicht erfolgreich ist. Aber wenn das .NET-Mitglied vorhanden ist, dann wird errorSuggestion weggeworfen und die .NET-Bindung hat Vorrang. Und schließlich, wenn die Sprache nicht weiß, ob die erfolgreiche Bindung war (zum Beispiel der Sprache hat eine „Methode fehlt“ Typ-Funktion) kann es wieder die Äste kombiniert w / es ist dynamisch überprüft. So Fallback verwenden Sie können nicht nur sagen, tun Reflexion, sondern auch können Sie wählen, ob dynamische oder statische Mitglieder Vorrang haben.

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