44 votes

Le mot clé dynamique en C # 4 prend-il en charge les méthodes d'extension?

Je suis en train d'écouter un discours à propos de C#4s' dynamic mot-clé et je me demandais " cette fonction soit orthogonale à l'autre .NET offre, par exemple, il sera de soutenir 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 le C#4 a été expédié ce qui est pourquoi il est formulé dans le futur.

48voto

Jon Skeet Points 692016

A partir du document doc "Nouvelles fonctionnalités de C # 4" :

La recherche dynamique ne pourra pas trouver de méthodes d'extension. Que les méthodes d'extension soient appliquées ou non dépend du contexte statique de l'appel (c'est-à-dire quelles clauses using se produisent), et cette information de contexte n'est actuellement pas conservée dans les données utiles.

4voto

Ian Warburton Points 1445

Cela 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);
 

Pourtant, 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.

MODIFIER:

C'est cool ... http://www2.research.att.com/~bs/multimethods.pdf

2voto

Olmo Points 1928

Cela ne fonctionne pas. Les méthodes d’extension fonctionnent selon que l’espace de nommage est inclus dans le fichier et, autant que je sache, MSIL n’a aucune idée des fichiers ni des espaces de nommage.

1voto

JoelFan Points 11368

Vous pouvez créer une méthode d'extension pour object et l'affecter à une dynamique :

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

et appelez comme ça:

 ClassWithMyProp x;
x.MyExt();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X