110 votes

Est-il possible en C# pour remplacer une méthode de classe avec une méthode d'extension?

Il y a eu des occasions où j'ai envie de remplacer une méthode dans une classe avec une méthode d'extension. Est-il possible de le faire en C#?

Par exemple:

public static class StringExtension
{
    public static int GetHashCode(this string inStr)
    {
        return MyHash(inStr);
    }
}

Un cas où j'ai voulu faire, c'est d'être en mesure de stocker un hash d'une chaîne de caractères dans une base de données et ont la même valeur soit utilisée par toutes les classes qui utilisent la classe string de hachage (c'est à dire un Dictionnaire, etc.) Depuis la construite en .Net algorithme de hachage n'est pas garanti pour être compatible d'une version du Cadre de travail pour la prochaine, je veux le remplacer par le mien.

Il y a d'autres cas que j'ai pu croiser où je veux remplacer une méthode de classe avec une méthode d'extension ainsi il n'est donc pas spécifique à la classe string ou la méthode GetHashCode.

Je sais que je pourrais le faire avec un sous-classement off une classe existante, mais il serait pratique de pouvoir le faire avec une extension dans beaucoup de cas.

101voto

Marc Gravell Points 482669

Non; une méthode d'extension ne prend jamais la priorité sur une méthode d'instance de signature, et de ne jamais participe à de polymorphisme (GetHashCode est virtual méthode).

8voto

Chris Brandsma Points 7225

Si la méthode a une signature différente, alors il peut être fait -- donc dans votre cas: aucun.

Mais sinon, vous devez utiliser l'héritage pour faire ce que vous êtes recherche pour.

2voto

Beatles1692 Points 2748

Pour autant que je sais que la réponse est non, parce que d'une méthode d'extension n'est pas une instance.C'est plus comme un intellisense facilité à moi qui vous permettent d'appeler une méthode statique à l'aide d'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 de faire autre chose.Utiliser un intercepteur (comme celui du Château de Projet contient tous les objets doivent être instansiated à l'aide d'une fabrique d'objet (ou un conteneur IoC dans le Château), de sorte que leurs interfaces peuvent être interceptés par l'intermédiaire d'un proxy dynamique générée lors de l'exécution.(Caslte vous permet également d'intercepter les membres virtuels de classes)

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