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.

Était-ce utile?

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top