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 :

Trouver classe qui implémente une interface


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut Trouver classe qui implémente une interface
    Bonjour,

    Je voudrais savoir quel est le moyen le plus simple pour retrouver toutes les classes qui implémentent une certaine interface dans toutes les dll d'un répertoire.

    Peut-on utiliser MEF ou Unity ou autre ... pour le faire ?

    Ou faut-il tout coder soit même ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par matdur Voir le message
    Bonjour,

    Je voudrais savoir quel est le moyen le plus simple pour retrouver toutes les classes qui implémentent une certaine interface dans toutes les dll d'un répertoire.
    Le plus simple est de procéder par la Reflection.

    Peut-on utiliser MEF ou Unity ou autre ... pour le faire ?
    Je ne connais pas MEF et concernant Unity je ne suis pas sur de voir un rapport.

    Ou faut-il tout coder soit même ?
    Bof ... ca fait deux boucles imbriquées (une pour les DLL, une pour les types) et un test avec la méthode IsAssignableFrom.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    concernant Unity je ne suis pas sur de voir un rapport.
    En fait je voudrai faire l'équivalent de la fonction ResolveAll de l'interface IUnityContainer de Unity, c-a-d obtenir toutes les instances d'un type, mais sans qu'il soit nécessaire de déclarer les types dans un fichier xml ou dans le code. Je voudrai simplement qui recherche dans les dll d'un répertoire.

  4. #4
    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
    si tu veux trouver les classes implémentant une interface dans une dll, la reflection peut faire ca en quelques lignes

    si tu veux des instances à l'execution, il faut coder pour pouvoir les retrouver, ou alors attaquer la CLR, mais là c'est du très haut niveau !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Aller, torché en 5mn montre en main;

    Tu fournis un path de recherche, une interface à chercher (par le Type, tu n'as qu'à modifier si tu veux chercher par le nom), et il balaie les dll et exe et retourne la liste des type implémentant l'interface.

    A améliorer bien sur.


    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
     
    public static List<Type> SearchInterface(string path, Type interfaceToSearch)
    {
     List<Type> matchingTypes = new List<Type>();
     string[] fileNamesDLL = System.IO.Directory.GetFiles(path, "*.DLL",  System.IO.SearchOption.AllDirectories);
     string[] fileNamesEXE = System.IO.Directory.GetFiles(path, "*.EXE",  System.IO.SearchOption.AllDirectories);
     
     List<string> assemblyList = new List<string>(fileNamesDLL);
     assemblyList.AddRange(fileNamesEXE);
     foreach (string fileName in assemblyList)
     {
      string assemblyPath = System.IO.Path.GetFullPath(fileName);
      Assembly assemblyToInspect = Assembly.LoadFile(assemblyPath);
      Type[] types = assemblyToInspect.GetTypes();
      foreach (Type typeToInspect in types)
      {
       if (interfaceToSearch.IsAssignableFrom(typeToInspect))
       {
        matchingTypes.Add(typeToInspect);
       }
      }
     }
     return matchingTypes;
    }

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    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
    sympa le IsAssignableFrom, je connaissais pas
    (je serais passé par GetInterfaces m'enfin ca fait quelques lignes de plus ^^)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Merçi à tous,

    Mention spéciale pour Bluedeep.
    J'ai pas regardé la discussion ce matin du coup j'ai fait ma propre version que voila

    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
     
    public List<T> CreateInstances<T>(string s_directory_path)
    {
    	List<T> o_result = new List<T>();
    	string[] as_files;
    	Assembly o_assembly;
     
    	if (Directory.Exists(s_directory_path) == true)
    	{
    	       as_files = Directory.GetFiles(s_directory_path, "*.dll", SearchOption.TopDirectoryOnly);
     
    	        foreach (string s_file in as_files)
    		{
    		       o_assembly = Assembly.LoadFrom(s_file);
     
    		      var o_instances = from o_type in o_assembly.GetExportedTypes()
    				          where (((o_type.IsAbstract == false) && (o_type.GetInterface(typeof(T).Name) != null)))
    					select ((T)o_assembly.CreateInstance(o_type.FullName));
     
     
    		o_result.AddRange(o_instances.ToList()); 
    	    }
    	}
     
    		return o_result;
    }


    Je vais essayer avec IsAssignableFrom pour voir ce que ça donne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/12/2014, 16h25
  2. liste des classes qui implémentent une interface
    Par Oussema86 dans le forum Général Java
    Réponses: 6
    Dernier message: 13/12/2010, 16h09
  3. Imposer une classe qui implemente une interface
    Par hwoarang dans le forum C#
    Réponses: 11
    Dernier message: 12/10/2010, 18h48
  4. Réponses: 3
    Dernier message: 03/10/2008, 11h45
  5. [REFLEXION] Connaitre toutes les classes qui implémentent une interface
    Par narmataru dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2006, 11h00

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