10
votes

Invoquant les méthodes d'extension de classe de base C # de la classe dérivée intérieure?

Ceci est un exemple artificiel: xxx

dans mon exemple ci-dessus, j'essaie d'appeler une méthode d'extension attribuée à une interface de ma classe dérivée. Le compilateur échoue ici et dit que MyMethod n'existe pas dans le contexte actuel. J'ai toutes les déclarations appropriées en utilisant mon fichier CS, donc je ne suis pas sûr de ce qui se passe.


0 commentaires

4 Réponses :


19
votes

Essayez de l'appeler comme Ceci : xxx


3 commentaires

Cela l'a fait. Merci. Je supposais que ça "ça". n'était pas nécessaire car je m'attendais à ce que cela fonctionne comme une autre fonction normale provenant d'une classe de base.


@ROBERT Dailey, les méthodes d'extension nécessitent toujours une instance pour les invoquer et dans le contexte de la classe, ils sont déclarés dans ce cas, c'est Ceci . C'est juste un inconvénient mineur qui ne peut pas comparer à tous les avantages que vous obtenez d'eux :-)


Mauvaises méthodes d'extension ne nécessitent pas d'instance pour les exécuter, car ce sont des méthodes statiques. Vous pouvez invoquer une méthode d'extension en tant que statique en lui transmettant des paramètres. Cependant, "base" n'est pas une valeur de paramètre valide pour le paramètre marqué de "ceci" dans la déclaration de méthode de poste.



3
votes

Essayez de l'appeler de cette façon:

this.MyMethod("test");


0 commentaires

0
votes

Modifier l'appel en xxx

Ce code compile: xxx


2 commentaires

Non, le compilateur ne sera pas échoué et il trouvera la méthode lorsque vous ajoutez "Ceci" mot-clé .. Je l'ai testé.


@Jalal oh heh j'ai quitté le commentaire original intact



4
votes

Voici une solution alternative (préférée par moi): xxx

pourquoi? - parce que la solution fournie précédemment ne fonctionnera pas dans les cas où la méthode d'extension appelle les classes " Nouvelle méthode (la propriété est une méthode aussi). Dans de tels cas, vous avez MAI l'intention d'appeler une méthode d'extension sur le type déclaré par la classe de base / interface, qui pourrait se comporter différemment de la classe / interface dérivée.

aussi, ceci la solution fonctionnera à la fois pour les méthodes "nouvelles" et "remplacement", car "le remplacement" virtuel invoquera de toute façon une version dérivée, qui serait également destinée.

EDIT: Ceci peut être Non pertinent si vous ne voulez pas vraiment passer la "base" à la méthode de l'extension et permettez plutôt de prendre "ceci". Cependant, vous devez envisager des différences comportementales.

Également, intéressant à noter comme une réponse au commentaire de Darin Dimitrov: méthodes d'extension ne nécessite pas nécessiter d'instance pour les exécuter, car ils sont des méthodes statiques. Vous pouvez invoquer une méthode d'extension en tant que statique en lui transmettant des paramètres. Cependant, "base" n'est pas une valeur de paramètre valide pour le paramètre marqué par "Ceci" dans la déclaration de méthode d'extension, qui (si j'étais ms), permettrait de simplifier l'utilisation générale des méthodes d'extension.


0 commentaires