Comment appeler une méthode d’extension portant le même nom qu’une méthode existante?

Dupliquer possible:
Est-il possible en C # de remplacer une méthode de classe par une méthode d’extension?

J’ai un code comme

public class TestA { public ssortingng ColA { get; set; } public ssortingng ColB { get; set; } public ssortingng ColC { get; set; } public void MethodA() { MessageBox.Show("Original A1."); } } static class ExtenstionTest { public static void MethodA(this TestA A1) { MessageBox.Show("Extended A1."); } } 

Maintenant, si j’appelle MethodA comme

 TestA a = new TestA(); a.MethodA(); 

Il appellera toujours la méthode d’origine. Comment puis-je appeler la méthode d’extension?

Vous ne pouvez pas appeler la méthode d’extension en tant que méthode d’extension normale. La méthode d’instance remplace la méthode d’extension avec la même signature

MODIFIER:

Vous pouvez l’appeler comme une méthode statique

 ExtensionTest.MethodA(a); 

Vous ne pouvez pas l’appeler comme méthode d’extension . C’est fondamentalement inutile à ce stade, en termes de méthode d’extension. (Personnellement, j’aimerais que ce soit un avertissement, mais peu importe.)

Le compilateur essaie toutes les méthodes d’ instance possibles avant de tenter de résoudre les méthodes d’extension. À partir de la section 7.6.5.2 de la spécification C # 4:

Dans une invocation de méthode de l’une des formes […] si le traitement normal de l’invocation ne trouve aucune méthode applicable, une tentative est faite pour traiter la construction comme une invocation de méthode d’extension.

et ensuite:

Les règles précédentes signifient que les méthodes d’instance ont priorité sur les méthodes d’extension

Vous pouvez toutefois l’appeler comme une méthode statique classique:

 // Fixed typo in name ExtensionTest.MethodA(a); 

Méthodes d’extension – MSDN

Une méthode d’extension portant le même nom et la même signature qu’une méthode d’interface ou de classe ne sera jamais appelée . Au moment de la compilation, les méthodes d’extension ont toujours une priorité plus basse que les méthodes d’instance définies dans le type même.

Vous pouvez appeler la méthode d’extension en tant que méthode statique régulière d’une classe.

 ExtenstionTest.MethodA(a); 

À partir du MSDN

En d’autres termes, si un type a une méthode appelée Process (int i) et que vous avez une méthode d’extension avec la même signature, le compilateur se liera toujours à la méthode d’instance. Lorsque le compilateur rencontre un appel de méthode, il recherche d’abord une correspondance dans les méthodes d’instance du type. Si aucune correspondance n’est trouvée, il recherchera toutes les méthodes d’extension définies pour le type et se liera à la première méthode d’extension trouvée. L’exemple suivant montre comment le compilateur détermine la méthode d’extension ou la méthode d’instance à laquelle se lier.

Vous pouvez appeler une méthode d’extension comme n’importe quelle autre méthode statique:

 ExtenstionTest.MethodA(a); 

comme d’autres l’ont suggéré, vous ne pouvez pas appeler cette méthode. La seule façon de l’appeler est la suivante:

 TestA a = new TestA(); ExtenstionTest.MethodA(a);