none
Création d'une classe générique C# et Visual studio RRS feed

  • Question

  • Bonjour,

    Je développe actuellement un projet chargé d'interagir avec un fichier assez complexe Microsoft.office.Excel.
    Dans l'idée d'améliorer mon code, je souhaiterai encapsuler un certain nombre de méthodes qui reviennent de façon redondante.

    Mon exemple est assez simple puisqu'il s'agit de deux méthodes quasi identiques chargées :

    • la première est chargée de créer un filtre sur une méthode OpenFileDialog :
    		private OpenFileDialog filtreExplorateur(OpenFileDialog file, string titre)
    		{
    			file.Filter =
    				"Fichier Excel : *.xlsx|*.xlsx|" +
    				"Fichier Excel 98 : *.xls|*.xls|" +
    				"Fichier Excel avec macro : *.xlsm|*.Xlsm|" +
    				"Tous les fichiers : *.*|*.*";
    			file.FilterIndex = 1;
    			file.InitialDirectory = @"C:\Users\bourges\OneDrive\Projets Visual Studio";
    			file.SupportMultiDottedExtensions = true;
    			file.Title = titre;
    			return file;
    		}
    • la seconde concerne l méthode de sauvegarde du fichier
    		private SaveFileDialog filtreExplorateur(SaveFileDialog file, string titre)
    		{
    			file.Filter =
    				"Fichier Excel : *.xlsx|*.xlsx|" +
    				"Fichier Excel 98 : *.xls|*.xls|" +
    				"Fichier Excel avec macro : *.xlsm|*.Xlsm|" +
    				"Tous les fichiers : *.*|*.*";
    			file.FilterIndex = 1;
    			file.InitialDirectory = @"C:\Users\bourges\OneDrive\Projets Visual Studio";
    			file.SupportMultiDottedExtensions = true;
    			file.Title = titre;
    			return file;
    		}
    

    Bien sûr ces deux méthodes sont vues comme des surcharges de la méthode filtreExplorteur et donc fonctionnent parfaitement.
    Toutefois et parce que ce type de redondance va se reproduire. J'aimerai créer une classe générique qui accepte ces deux objets ce la classe System.Windows.Forms.

    Dans l'état actuel de mes recherche je n'arrive pas à déterminer le type générique à adopter.

    Je vous remercie pour les réponses, conseils et autre que vous pourrez m'apporter?

    PB_BZH (Patrick)

    lundi 26 octobre 2015 10:31

Réponses

  • Bonjour,

    OpenFileDialog et SaveFileDialog héritent tous les deux de FileDialog. Par conséquent, si vous écrivez une seule méthode en remplaçant le type OpenFileDialog/SaveFileDialog par FileDialog vous aurez le résultat obtenu. Votre méthode pourra être appelée dans les 2 cas. C'est ce que permet le concept de covariance, si je ne me trompe pas.

    lundi 26 octobre 2015 14:12
  • Pour éviter le cast, vous pouvez écrire ceci
    private T filtreExplorateur<T>(T file, string titre) where T : FileDialog
    

    lundi 26 octobre 2015 15:29
  • Bonjour,

    Je vous remercie pour cette réponse. Et, effectivement, s'ils héritent tous les deux de FileDialog (ce qui ne m'étonne pas finalement), cela marchera forcement.

    Cordialement

    Patrick

    lundi 26 octobre 2015 14:23
  • Bonjour à nouveau,

    Oui cela marche. Toutefois, il est nécessaire de faire un cast explicite lors de l'appel de la méthode

    // Méthode (unique cette fois)
    //--------------------------------
    		private FileDialog filtreExplorateur(FileDialog file, string titre)
    		{
    			file.Filter =
    				"Fichier Excel : *.xlsx|*.xlsx|" +
    				"Fichier Excel 98 : *.xls|*.xls|" +
    				"Fichier Excel avec macro : *.xlsm|*.Xlsm|" +
    				"Tous les fichiers : *.*|*.*";
    			file.FilterIndex = 1;
    			file.InitialDirectory = @"C:\Users\bourges\OneDrive\Projets Visual Studio";
    			file.SupportMultiDottedExtensions = true;
    			file.Title = titre;
    			return file;
    		}
    
    // Appels de cette méthode
    //-----------------------------
    // 1 - Ouverture du fichier
    //---------------------------
    OpenFileDialog ExplorateurDeFichier = new OpenFileDialog();
    ExplorateurDeFichier = (OpenFileDialog) filtreExplorateur(ExplorateurDeFichier, "Ouverture du fichier de Service");
    
    // 2 - Enregistrement sous du fichier
    //--------------------------------------
    SaveFileDialog sfdExcel = new SaveFileDialog();
    sfdExcel = (SaveFileDialog) (filtreExplorateur(sfdExcel, "Sauvegarde du fichier"));
    
    
    
    

    Après vérification et le cast tout de même nécessaire devant l'appel de la méthode, tout fonctionne parfaitement

    Encore merci

    Patrick


    lundi 26 octobre 2015 14:58
  • Bonsoir,

    Je vous remercie, cela marche parfaitement. Il est vrai que j'ai encore un peu de mal avec les classes génériques. Ceci dit, c'est dans ce sens que je cherchais une solution.

    Merci donc pour cet exemple concret.

    Bien à vous

    Patrick

    lundi 26 octobre 2015 17:14

Toutes les réponses

  • Bonjour,

    OpenFileDialog et SaveFileDialog héritent tous les deux de FileDialog. Par conséquent, si vous écrivez une seule méthode en remplaçant le type OpenFileDialog/SaveFileDialog par FileDialog vous aurez le résultat obtenu. Votre méthode pourra être appelée dans les 2 cas. C'est ce que permet le concept de covariance, si je ne me trompe pas.

    lundi 26 octobre 2015 14:12
  • Bonjour,

    Je vous remercie pour cette réponse. Et, effectivement, s'ils héritent tous les deux de FileDialog (ce qui ne m'étonne pas finalement), cela marchera forcement.

    Cordialement

    Patrick

    lundi 26 octobre 2015 14:23
  • Bonjour à nouveau,

    Oui cela marche. Toutefois, il est nécessaire de faire un cast explicite lors de l'appel de la méthode

    // Méthode (unique cette fois)
    //--------------------------------
    		private FileDialog filtreExplorateur(FileDialog file, string titre)
    		{
    			file.Filter =
    				"Fichier Excel : *.xlsx|*.xlsx|" +
    				"Fichier Excel 98 : *.xls|*.xls|" +
    				"Fichier Excel avec macro : *.xlsm|*.Xlsm|" +
    				"Tous les fichiers : *.*|*.*";
    			file.FilterIndex = 1;
    			file.InitialDirectory = @"C:\Users\bourges\OneDrive\Projets Visual Studio";
    			file.SupportMultiDottedExtensions = true;
    			file.Title = titre;
    			return file;
    		}
    
    // Appels de cette méthode
    //-----------------------------
    // 1 - Ouverture du fichier
    //---------------------------
    OpenFileDialog ExplorateurDeFichier = new OpenFileDialog();
    ExplorateurDeFichier = (OpenFileDialog) filtreExplorateur(ExplorateurDeFichier, "Ouverture du fichier de Service");
    
    // 2 - Enregistrement sous du fichier
    //--------------------------------------
    SaveFileDialog sfdExcel = new SaveFileDialog();
    sfdExcel = (SaveFileDialog) (filtreExplorateur(sfdExcel, "Sauvegarde du fichier"));
    
    
    
    

    Après vérification et le cast tout de même nécessaire devant l'appel de la méthode, tout fonctionne parfaitement

    Encore merci

    Patrick


    lundi 26 octobre 2015 14:58
  • Pour éviter le cast, vous pouvez écrire ceci
    private T filtreExplorateur<T>(T file, string titre) where T : FileDialog
    

    lundi 26 octobre 2015 15:29
  • Bonsoir,

    Je vous remercie, cela marche parfaitement. Il est vrai que j'ai encore un peu de mal avec les classes génériques. Ceci dit, c'est dans ce sens que je cherchais une solution.

    Merci donc pour cet exemple concret.

    Bien à vous

    Patrick

    lundi 26 octobre 2015 17:14