IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Création d'objet en fonction d'une énumération


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut Création d'objet en fonction d'une énumération
    Bonjour,

    Je dispose d'une énumération listant les différents fichiers gérés par une application. Je suis en train de réfléchir à un système me permettant d'extraire et traiter les données issues de ces différents fichiers.

    Pour cela, j'ai créé une classe abstraite FileObject contenant les informations génériques d'un fichier à traiter.
    Je crée ensuite une classe pour chaque fichier FileObjectTypeX héritant de la classe FileObject.

    L'idée serait ensuite d'instancier l'objet associé en fonction de chaque type de fichier contenu dans l'énumération.
    Ma première idée étant d'avoir un switch/case sur l'énumération.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public FileObject getFileObj(TypeEnum typeOfFile)
    {
    	FileObject fileObj = null;
     
    	try 
    	{
    		switch (typeOfFile)
    		{
    			case TypeEnum.type1:
    				fileObj = new FileObjectType1();
    			break;
     
    			case TypeEnum.type2:
    				fileObj = new FileObjectType2();
    			break;
     
    			case TypeEnum.type3:
    				fileObj = new FileObjectType3();
    			break;
     
    			etc...
    		}
    	} 
    	catch {}
     
    	return fileObj;
    }
    Je me demandais s'il n'y avait pas une solution plus pratique/élégante, étant donné que l'énumération contient un bon paquet d'éléments (~150).

    Quel sont vos avis ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    soit il faut préciser quelque part comment faire le lien entre une valeur d'énum et un type
    pour ca il y a légèrement mieux que le switch, mais ca reste du code
    par exemple un dictionary<enum, type>, il faut donc à un endroit faire un .add(valeur enum, typeof(classe))
    puis instancier dic[enumvalue]
    sinon peut etre un attribut à créé et qu'il faudrait mettre sur chaque valeur d'enum, et par reflection retrouver la classe liée à la valeur de l'enum via l'attribut
    (ou alors l'inverse, un attribut à mettre au dessus d'une classe avec la valeur de l'enum liée)

    soit il faut trouver un moyen implicite de faire le lien, genre si le nom de la classe peut etre déduit par la valeur de l'enum (enfin son libellé) alors par reflection là aussi tu pourras la retrouver


    le plus simple reste le dictionary je pense, et ca fait assez propre, tu peux avoir un constructeur static avec les 150 add
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    150? Ça fait beaucoup pour une enumeration, non?
    Pour éviter un switch/case infini, la comme ça, je pense a un Dictionary<TypeEnum, Type>, ce sera facile de le remplir avec des lignes du genre dico.Add(TypeEnum.typeXX, typeof(FileObjectTypeXX)); (un peu de concatenation dans excel en viendra a bout en quelques secondes...
    Et tu peux remplacer ta méthode getFileObj par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public FileObject getFileObj(TypeEnum typeOfFile)
    {
          return (FileObject)Activator.CreateInstance(dico[typeOfFile]);
    }
    C'est pas très beau mais ça marche...
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Merci Pol63, nouanda.

    L'idée du dictionnaire est effectivement plus sympa que le switch !
    Et oui, une énumération de 150 éléments c'est beaucoup... Mais j'ai pas mal de fichiers à gérer J'ai pas de solution plus pratique à ce niveau là.

    Merci également pour l'astuce de Activator, je ne connaissais pas.

  5. #5
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le plus simple reste le dictionary je pense, et ca fait assez propre, tu peux avoir un constructeur static avec les 150 add
    J'ai passe tellement de temps a écrire mon message que je n'avais pas vu ta réponse!
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai du mal à comprendre, je me demande si tu ne fait pas fausse route.

    J'imagine que le type de FileObject dépend de l'extension de ton fichier ?
    Que vaut "TypeEnum" ? Quelque chose comme cela ?
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    enum TypeEnum {jpg, bmp, txt, docx, xlsx, exe, zip, ...};

    Ou est l'intelligence de choix de type en fonction de l'extension ?

    Ta méthode getFileObj te retourne peut être un objet du type que tu attend mais il n'est aucunement lié à un fichier, comment va tu en extraire les données ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Non il ne s'agit pas d'une enum par rapport à l'extension de fichier.
    En fait je reçois périodiquement des fichiers spécifiques contenant des données journalières/mensuelles, et cette enum permet de les flagger en fonction de sa provenance, et des données qu'ils contiennent. (ça peut-être du xml, csv, xlsx, txt, etc...)

    Dans ma classe principale, j'ai mon FileInfo qui me permet de cibler mon fichier et d'en déduire son type.
    Une fois que j'ai mon FileObjectTypeX je compte utiliser une surcharge d'une méthode ExtractData de ma classe abstraite FileObject pour faire le traitement adéquat.

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 897
    Points : 1 913
    Points
    1 913
    Par défaut
    Un autre option puisque tous tes objets hériteront d'un type commun, plutôt que de stocker un type dans le dictionnaire, est de stocker une fonction qui renverra un nouvel objet du type, ce qui peut se faire de façon concise avec les expression lambda :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dictionary<EnumType, Func<FileObject>> _funcMap = new Dictionary<EnumType, Func<FileObject>>();
    _funcMap[EnumtType.Type1] = () => new Type1FileObject();
    _funcMap[EnumtType.Type2] = () => new Type2FileObject();
    Invocation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FileObject CreateHandler(EnumType type)
    {
      return _funcMap[type]();
    }

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/02/2009, 18h44
  2. Réponses: 1
    Dernier message: 02/10/2008, 10h18
  3. [97] Création d'état en fonction d'une requête
    Par totojordi dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/06/2008, 09h47
  4. Création de listes déroulante fonction d'une valeur
    Par toutoune60 dans le forum Excel
    Réponses: 3
    Dernier message: 11/04/2008, 11h11
  5. Réponses: 4
    Dernier message: 08/03/2008, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo