2009-05-31 5 views
20

Ich recherchiere derzeit die zweite Ausgabe von C# in Depth und versuche, "dynamische Protokollpuffer" zu implementieren - d. H. Eine Ebene der dynamischen Unterstützung zusätzlich zu meiner bestehenden Protokollpufferbibliothek. Als solche habe ich einen Typ, der von DynamicObject abgeleitet ist. Nach ein bisschen Herumspielen habe ich es geschafft, auf einfache Eigenschaften mit bemerkenswert wenig Code zu reagieren, aber ich möchte noch viel weiter gehen - und wirklich verstehen, was vor sich geht.Was ist die beste Informationsquelle zum DLR (.NET 4.0 Beta 1)?

Bisher habe ich noch keine guten Erklärungen für das DLR gefunden - und viele der Blogposts sind nun wirklich veraltet, da sich die Dinge (glaube ich) zwischen dem bisherigen CTP und .NET 4.0 Beta 1 geändert haben Die MSDN documentation for DynamicObject ist im Moment ziemlich minimal.

Meine unmittelbarste Abfrage ist, ob es eine einfache Art zu sagen gibt, "Verwenden Sie Reflektion, um alle Anrufe zu binden, die ich mit diesem bestimmten Objekt nicht behandeln kann." (Mit anderen Worten, ich möchte die bestehende Reflexionsbindung verstärken, anstatt alles selbst zu tun, wenn es möglich ist.) Leider bin ich nicht sehr weit von Ratespielen entfernt.

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

+5

Sehen und hier dachte ich, du meintest die Docklands Light Railway. :) – cletus

+10

Cletus Witz als Duplikat schließen: http://stackoverflow.com/questions/655194/how-does-the-dlr-work;) –

Antwort

23

Beste Quelle habe ich gefunden und gelesen ist häufig die letzten Jahre im Wert von Chris Burrow Beiträgen auf his blog .

Es gibt auch die official DLR documentation page, die von der main DLR site ist.

+1

Ooh, das sieht sehr praktisch aus, danke - ich mag besonders die Tatsache, dass es ist alle letzten :) Die "Einleitung des Bibliotheksautors" sieht so aus, als sei * genau * das Richtige. –

+36

Nun, das war deine Frage. "... jüngste Quellen der Dokumentation ..." :) Gibt es ein Abzeichen, um eine Antwort von Jon Skeet zu akzeptieren? – TheSoftwareJedi

5

Ich recherchiere das auch im Moment und es gibt noch nicht so viele Infos. Ich kann nicht mit Ihrer Frage helfen, aber unten sind einige Informationen, die ich gefunden habe:

Es gibt eine angemessene Menge innerhalb der PDC Videos.

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

Dieser Artikel spricht darüber, wie das DLR arbeitet mit Ironpython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

Es gibt eine sehr kleine Menge im Training Kit Vorschau auf: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

Hoffnung dies hilft

Alex

3

Standardmäßig sagt DynamicObject "fallback to reflection", wenn Ihre Try * -Funktionen false zurückgeben. So können Sie bereits Eigenschaften und Felder zu Ihrer Unterklasse erben und hinzufügen, die alle durch Reflektion behandelt werden, wenn der dynamische Pfad die Suche nicht durchführt.

Wenn Sie mehr in die Tiefe gehen, sollten Sie sich IDynamicMetaObjectProvider ansehen. Auf dieser niedrigeren Ebene wird die Fallback * -Methode für den eingehenden DynamicMetaObjetBinder aufgerufen. Dadurch kann die aufrufende Sprache die Auflösung bereitstellen. Sie können diesen AST dann zurückgeben oder zu einem größeren AST zusammenstellen, den Sie zurückgeben. Grundsätzlich Fallback * lassen Sie die AST, die die aufrufende Sprache würde einschließlich der korrekte Fehler (Ausnahme, nicht definiert in JS, etc ...).

Die Art und Weise, wie DynamicObject das Fallback zur Reflektion vornimmt, besteht darin, dass es die Fallback * -Methode des Binders zweimal aufruft.Beim ersten Mal fällt es ohne einen "errorSuggestion" -Parameter zurück. Dies erhält entweder den Fehler oder den AST, der mit Reflektion erstellt wurde. Es erzeugt dann einen AST, das etwas ist, wie:

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

es dann diesen kombinierte AST nimmt und tatsächlich gibt ihn in als Fehler Vorschlag für das Bindemittel auf einem zweiten Rückfall. Der Binder sollte dann diese errorSuggestion berücksichtigen, wenn die Bindung nicht erfolgreich ist. Wenn jedoch das .NET-Member vorhanden ist, wird errorSuggestion verworfen und die .NET-Bindung hat Vorrang. Und schließlich, wenn die Sprache nicht weiß, ob die Bindung erfolgreich war (z. B. hat die Sprache ein Merkmal "Methode fehlt"), kann sie wiederum die ASTs mit ihren dynamischen Prüfungen kombinieren. Wenn Sie Fallback verwenden, können Sie nicht nur die Reflektion sagen, sondern Sie können auch wählen, ob dynamische oder statische Elemente Vorrang haben.

+1

Danke. Das Problem mit DynamicObject ist, dass es auf die Reflektion von * diesem * Objekt zurückgreift - ich möchte, dass es auf ein * anderes * Objekt zurückreflektiert wird, und ich vermute, dass dies funktionieren würde, müsste ich IDynamicMetaObjectProvider implementieren mehr Ärger als es in diesem Fall wert ist. Ich habe am Ende eine Menge Methoden in meinen dynamischen Typ kopiert, die nur auf das andere Objekt übertragen werden, so dass ich immer noch den Vorteil der Reflexion habe. Hässlich, aber es funktioniert. –

+1

@ Jon Skeet Sie schreiben eine einfache T4-Datei, um dieses Adaptermuster für jedes Objekt innerhalb einer partiellen Klasse relativ einfach zu codegen. Wenn Sie eine solche Frage stellen, werde ich eine Lösung für Sie buchen! – TheSoftwareJedi