Le mot clé dynamique en C # 4 prend-il en charge les méthodes d'extension?
-
06-07-2019 - |
Question
Je suis écoutez une conversation sur le mot clé dynamique
de C # 4 et je me demande ... Cette fonctionnalité sera-t-elle orthogonale par rapport aux autres. Fonctionnalités NET, par exemple, supportera-t-il les méthodes d’extension?
public static class StrExtension {
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?
Remarque: Cette question a été posée avant l'envoi de C # 4, raison pour laquelle elle est formulée au futur.
La solution
Extrait du " Nouvelles fonctionnalités de C # 4 " word doc :
La recherche dynamique ne pourra pas trouver des méthodes d'extension. Qu'il s'agisse les méthodes d'extension s'appliquent ou non dépend sur le contexte statique de l'appel (c'est-à-dire quelles clauses using se produisent), et cette information de contexte n'est pas actuellement conservés dans la charge utile.
Autres conseils
Ceci fonctionne que je trouve intéressant au moins ...
public static class StrExtension
{
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
StrExtension.twice(x);
Néanmoins, si le compilateur peut trouver la bonne méthode d’extension au moment de la compilation, je ne vois pas pourquoi il ne pouvait pas empaqueter un ensemble de méthodes d’extension à rechercher au moment de l’exécution? Ce serait comme une v-table pour les méthodes non membres.
EDIT:
C’est cool… http: //www2.research.att. com / ~ bs / multimethods.pdf
Cela ne fonctionne pas. Les méthodes d’extension fonctionnent selon que l’espace de noms est inclus dans le fichier et, autant que je sache, MSIL n’a aucune idée des fichiers ni des espaces de noms.
Vous pouvez créer une méthode d'extension pour objet et l'assigner à un dynamique :
.public static void MyExt(this object o) {
dynamic d = o;
d.myProp = "foo";
}
et appelez-le comme ceci:
ClassWithMyProp x;
x.MyExt();