2008-11-03 8 views
5

In C# 4.0 werden wir laut Anders verschiedene dynamische Typen oder Objekte erhalten, deren "statischer Typ dynamisch ist". Auf diese Weise kann die Auflösung aller Methodenaufrufe zur Laufzeit statt zur Kompilierzeit erfolgen. Aber wird es eine Möglichkeit geben, das dynamische Objekt an irgendeine Art von Vertrag zu binden (und damit auch volle Intelligenz dafür zu bekommen), anstatt irgendeinen Anruf darauf zu erlauben, selbst wenn Sie wissen, dass es wahrscheinlich nicht gültig ist.Haben dynamische C# 4.0-Objekte eine Möglichkeit zur Eingabe von Enten?

I.e. statt nur

dynamic foo = GetSomeDynamicObject(); 

haben die Fähigkeit, es zu werfen oder zu transformieren sie in einen bekannten Vertrag zu beschränken, wie

IFoo foo2 = foo.To<IFoo>; 

oder auch nur

IFoo foo2 = foo as IFoo; 

Kann nichts finden wie das in den vorhandenen Materialien für C# 4.0, aber es scheint wie eine logische Erweiterung des dynamischen Paradigmas. Jeder mit mehr Informationen?

Antwort

2

Ich bin nicht bewusst, dass etwas wirklich Ente Ente tippen, fürchte ich. Ich habe blogged about the idea, aber ich erwarte keine Unterstützung. Es wäre wahrscheinlich nicht zu schwierig, Reflection.Emit zu verwenden, um eine Klasse zu erstellen, die eine Implementierung einer gegebenen Schnittstelle generiert, ein dynamisches Objekt im Konstruktor übernimmt und jeden Aufruf einfach an ihn weiterleitet. Nicht ideal, aber es könnte eine Notlösung sein.

1

Das ist eine coole Idee. Wenn ich Sie verstehe, beschreibe/schlage ich eine Fähigkeit der CLR vor, wobei beim Versuch, ein dynamisches Objekt an eine Schnittstelle zu werfen, die vom dynamischen Objekt unterstützten Methoden/Eigenschaften untersucht werden sollten die diese Schnittstelle effektiv implementieren. Dann würde die CLR dafür sorgen, dass "IFoo" für das Objekt implementiert wird, sodass Sie das dynamische Objekt dann auf ein IFoo-Objekt umwandeln können. Fast sicher, dass das nicht unterstützt wird, aber es ist eine interessante Idee.

+0

Es geht weniger um die Implementierung von IFoo, da es immer noch ein dynamisches Objekt wäre, dh der Aufruf würde zur Laufzeit noch passieren, aber Sie könnten ihn jetzt als IFoo weitergeben, weil Sie dem Compiler gesagt haben, dass sich Ihr dynamisches Objekt wie ein IFoo –

+0

Ja, aber wenn Sie möchten, dass ein IFoo zur Hand ist, müsste jemand eine Passthrough-IFoo-Implementierung mit dem dynamischen Objekt erstellen. Darüber spricht Jon Skeet. – mackenir

+0

Sie können dies heute ganz einfach implementieren, wenn Sie das Shim in Python oder Ruby schreiben möchten. –

1

Tobias Hertkorn beantwortete meine Frage here mit einem Link zu seinem blogpost zeigt ein Beispiel für die Verwendung der Convert() -Methode auf MetaObject, um einen dynamischen Proxy zurückzugeben. Es sieht sehr vielversprechend aus.

+0

Interessanter Artikel, aber die Arbeit ist wirklich in Castle DynamicProxy, die ich heute verwende, um "Enten" -Typen zu erstellen, so dass hier scheinbar nichts zur Party kommt. Ich hatte gehofft, dass Dynamik mein Bedürfnis nach DynamicProxy beseitigen würde –

Verwandte Themen