Frage

Ich bin Hören Sie sich einen Vortrag an um C#4's dynamic Schlüsselwort und ich frage mich ... Wird diese Funktion orthogonal zu anderen .NET -Funktionen sein, wird sie beispielsweise Erweiterungsmethoden unterstützen?

public static class StrExtension {
    public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?

Notiz: Diese Frage wurde vor dem Versand von C#4 gestellt, weshalb sie in Zukunft angespannt ist.

War es hilfreich?

Lösung

Von dem "Neue Funktionen in C# 4" Wortdoc:

Dynamische Suche kann keine Erweiterungsmethoden finden. Ob Erweiterungsmethoden gelten oder nicht, hängt vom statischen Kontext des Aufrufs ab (dh der Verwendung von Klauseln), und diese Kontextinformationen werden derzeit nicht als Teil der Nutzlast aufbewahrt.

Andere Tipps

Das funktioniert, was ich zumindest interessant finde ...

public static class StrExtension
{
   public static string twice(this string str) { return str + str; }
}

...
dynamic x = "Yo";
StrExtension.twice(x);

Wenn der Compiler die korrekte Erweiterungsmethode zur Kompilierungszeit finden kann, dann sehe ich nicht, warum er keine Reihe von Erweiterungsmethoden verpackt, um zur Laufzeit nachzuschlagen? Es wäre wie ein V-Tisch für Nichtmitgliedmethoden.

BEARBEITEN:

Das ist cool... http://www2.research.att.com/~bs/multimethods.pdf

Es kann nicht funktionieren, Erweiterungsmethoden funktionieren je nach Namespace in der Datei, und soweit ich weiß, hat MSIL keine Ahnung von Dateien und einschließlich Namespaces.

Sie können eine Erweiterungsmethode für erstellen Objekt und zuweisen es a dynamisch:

public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

und nenn es so:

ClassWithMyProp x;
x.MyExt();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top