none
Méthodes d'extension RRS feed

  • Question

  • Bonjour tout le monde,

    ScottGu dans son blog en 2007 a bien expliqué ce qu'est une méthode d'extension :

    New "Orcas" Language Feature: Extension Methods

    Il indique que cela est disponible avec "Orcas". J'ai demandé à Google de me trouver cela, dans toute la première page des résultats il a été question d'Orca, un éditeur de table, j'ai l'impression que ce n'est qu'une vague homonymie ? Orca.exe

    A la lumière d'un autre fil dans le forum, Comment ajouter une méthode d'Extension statique ?, je me suis rendu compte qu'il est facile d'implémenter une méthode d'extension statique en l'écrivant dans la classe utilisatrice. Pour regrouper les méthodes d'extension dans une classe à part comme l'a fait ScottGu, apparemment sous Visual Web Developper 2010 Express il ne suffit pas de la mettre dans le répertoire Shared d'un projet MVC, même après génération de l'application.

    Existe-t-il toujours pour cela un outil à installer par dessus, et est-il raisonnable de l'installer avec une machine à 1 Go de mémoire ?



    vendredi 8 juillet 2016 05:28

Réponses

  • MVc4BlogsCF3 n'est pas la classe mais le namespace dans lequelle la méthode d'extension est déclarée...

    namespace Mvc4BlogsCF3
    {
        public static class ScottGuExtensions
        {
            public static bool IsValidEmailAddress(this string s)
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(s);
            }
        }
    }

    Si vous voulez que la méthode d'extension soit disponible dans intellisense, il faut déclarer le namespace.

    • Marqué comme réponse Gloops vendredi 8 juillet 2016 12:53
    vendredi 8 juillet 2016 09:15

Toutes les réponses

  • Bonjour,

    De mémoire, mais je peux me tromper, Orcas était un nom de code pour une version de Visual Studio.

    En ce qui concerne les méthodes d'extension, Je pense que vous n'avez pas bien compris le principe.

    Il s'agit d'une fonctionnalité offerte aux développeurs pour ajouter des méthodes à une classe donc ils ne disposent pas du code source en évitant l'héritage. Par exemple, je veux ajouter une méthode à la classe string, donc par définition le code appartient à Microsoft. Je peux ajouter ma méthode d'extension pour qu'elle devienne utilisable "comme" une méthode classique programmée dans la classe.

    Voici un lien vers la documentation sur MSDN : Extension Methods

    Si vous avez encore des questions, n'hésitez pas à revenir.

    vendredi 8 juillet 2016 06:59
  •  Bonjour Gloops,

    Les méthodes d'extensions sont une fonctionnalités du langage C# et VB, "Orca" n'est pas un outil qui permet de rajouter cela, ce doit être un nom de code.

    Comme leur nom l'indique, une méthode d'extension rajoute un comportement à une classe sans pour autant avoir accès à la source de celle-ci. Dans l'exemple du blog de ScottGu, il rajoute une méthode d'extension permettant de vérifier une adresse mail pour la classe System.String.

    La règle est qu'une méthode d'extension doit se déclarer dans une classe statique et doit être elle même un méthode statique en prenant en paramètre this avec la classe que laquelle la méthode d'extension sera attribuée.

    Cordialement

    vendredi 8 juillet 2016 07:23
  • Bonjour,

    Oui, il me semble que tout cela est expliqué clairement dans le blog de StottGu, avec notamment l'exemple de IsValidEmailAddress, que j'ai essayé d'implémenter.

    Dans le répertoire Shared de mon projet MVC j'ai créé une classe (en fait je l'avais d'abord créée sous la racine, avant de réaliser que si ce répertoire portait ce nom il devait bien y avoir une raison, alors j'ai glissé la classe vers là) :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text.RegularExpressions;
    
    namespace Mvc4BlogsCF3
    {
        public static class ScottGuExtensions
        {
            public static bool IsValidEmailAddress(this string s)
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(s);
            }
        }
    }

    Une fois ceci fait, après avoir généré l'application, en haut du module d'un contrôleur j'ai tapé using suivi d'un espace, et je m'attendais à ce que l'intellisense me propose ScottGuExtensions, or ce n'est pas le cas, même après avoir tapé le nom de l'espace de noms suivi d'un point.

    J'ai mis la méthode dans la classe du contrôleur, ça a fonctionné une fois (du moins j'avais bien le nom de la méthode d'extension dans l'intellisense derrière une string) et a la génération suivante ça m'a signalé une erreur, comme quoi la méthode d'extension n'était pas à sa place.

    Du coup, dans le même fichier que le contrôleur, mais en dessous de sa classe, j'ai ajouté une autre classe :

        public static class NonGenerique
        {
            public static bool IsValidEmailAddress(this string s)
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(s);
            }
        }

    J'aurais pu garder le même nom mais c'est un clin d'œil à la mention quelque part que cette classe ne doit pas être générique. Bien sûr, ce coup-là il a fallu mettre la référence System.Text.RegularExpressions en haut du module du contrôleur.

    Une fois que j'ai mis les deux classes dans le même fichier, dans le code du contrôleur en tapant une chaîne de caractères suivie d'un point, j'ai bien IsValidEmailAddress de proposé. Une fois que j'arriverai à placer la méthode d'extension dans un autre fichier je pousserai le test jusqu'au bout ...

    Une précision, encore : j'ai regardé dans les propriétés de la classe ScottGuExtensions, l'action de génération est bien à Compiler. Copier dans le répertoire de sortie : ne pas copier.

    Bon, vous me dites que non, il n'y a pas autre chose à installer. Bon mais alors ça devrait marcher ?

    ça veut dire que j'ai oublié -ou loupé- quelque chose ?

    Mais quoi, alors ?



    • Modifié Gloops vendredi 8 juillet 2016 08:03
    vendredi 8 juillet 2016 07:47
  • Quand vous voulez utiliser la méthode d'extension déclarée dans la class ScottGuExtensions, vous devez veillez à déclarer le namespace :
    using Mvc4BlogsCF3
    vendredi 8 juillet 2016 08:21
  • Bonjour,

    vous n'avez pas besoin de using le nom de la classe statique (d'ailleurs, si c'était le cas, il faudrait passer par un using static).

    En MVC, le répertoire Shared est destiné aux vues, pas au code.

    Cordialement,

    vendredi 8 juillet 2016 08:38
  • MVc4BlogsCF3 n'est pas la classe mais le namespace dans lequelle la méthode d'extension est déclarée...

    namespace Mvc4BlogsCF3
    {
        public static class ScottGuExtensions
        {
            public static bool IsValidEmailAddress(this string s)
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(s);
            }
        }
    }

    Si vous voulez que la méthode d'extension soit disponible dans intellisense, il faut déclarer le namespace.

    • Marqué comme réponse Gloops vendredi 8 juillet 2016 12:53
    vendredi 8 juillet 2016 09:15
  • Oups ... Ce qui s'appelle lire le blog religieusement :)

    En fait il a mis sa classe dans un espace de noms du même nom, et comme il ne l'a pas fait apparaître ... linotte a bifurqué.

    Désolé, j'aurais dû faire le lien.

    vendredi 8 juillet 2016 12:55