Wird das dynamische Schlüsselwort in C#4 Erweiterungsmethoden unterstützen?
-
06-07-2019 - |
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.
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();