Existe-t-il un moyen en C # de remplacer une méthode de classe par une méthode d’extension?

Il y a eu des occasions où je voudrais remplacer une méthode dans une classe avec une méthode d’extension. Y a-t-il un moyen de le faire en C #?

Par exemple:

public static class SsortingngExtension { public static int GetHashCode(this ssortingng inStr) { return MyHash(inStr); } } 

Un cas où je voulais faire cela était de pouvoir stocker un hachage de chaîne dans une firebase database et d’utiliser la même valeur pour toutes les classes qui utilisent le hachage de la classe de chaîne (par exemple, Dictionary, etc.). L’algorithme de hachage .Net intégré n’est pas garanti pour être compatible d’une version du Framework à l’autre, je veux le remplacer par le mien.

Il y a d’autres cas sur lesquels j’ai couru où je voudrais remplacer une méthode de classe par une méthode d’extension, donc ce n’est pas seulement spécifique à la classe de chaîne ou à la méthode GetHashCode.

Je sais que je pourrais le faire en sous-classant une classe existante, mais il serait utile de pouvoir le faire avec une extension dans de nombreux cas.

Non; une méthode d’extension ne prend jamais la priorité sur une méthode d’instance avec une signature appropriée et ne participe jamais au polymorphism ( GetHashCode est une méthode virtual ).

Si la méthode a une signature différente, alors cela peut être fait – donc dans votre cas: non.

Mais sinon, vous devez utiliser l’inheritance pour faire ce que vous recherchez.

Pour autant que je sache, la réponse est non, car une méthode d’extension n’est pas une instance. Cela ressemble plus à une fonctionnalité intellisense qui me permet d’appeler une méthode statique en utilisant une instance d’une classe. Je pense qu’une solution à votre problème peut être un intercepteur qui intercepte l’exécution d’une méthode spécifique (par exemple GetHashCode ()) et fait autre chose. Pour utiliser un tel intercepteur (comme le propose le projet Castle), tous les objects la fabrique d’objects (ou un conteneur IoC dans Castle) afin que leurs interfaces puissent être interceptées via un proxy dynamic généré à l’exécution (Caslte vous permet également d’intercepter des membres virtuels de classes)