Programmation.c# : Problème avec IsSubclassOf

Posté par jusob () le 05 février 2005
0
Bonjour,

je me lance dans le C#.

J'ai un programme qui doit charger des DLLs. Ces DLLs implémentent l'interface PluginInterface.



Programme principal:

foreach (Type type in assembly.GetTypes())

{

if (type.IsSubclassOf(typeof(PluginInterface)) || type.Equals(typeof(PluginInterface))

|| type == typeof(PluginInterface) || type.IsInstanceOfType(typeof(PluginInterface))) // && !type.IsAbstract) if PluginInterface is not an Interface

{

Console.WriteLine("and this is a plugin");

pluginList.Add((PluginInterface) Activator.CreateInstance(type));

}

else

Console.WriteLine("but this is NOT a plugin ({0}) ({1})", type, typeof(PluginInterface));

}



La DLL:

public class Plugin : PluginInterface

{

....

}





Et en sortie:

Found /home/julien/Projects/depot/branches/jsobrier/platine/PluginInterface/validation/Plugin.dll

but this is NOT a plugin (PluginInterface) (PluginInterface)

but this is NOT a plugin (Plugin) (PluginInterface)

but this is NOT a plugin (Session) (PluginInterface)



Je comprends pas ce qui ne vas pas surtout quand je vois "(PluginInterface) (PluginInterface)"!



Et connaissez-vous des mailing list ou forums sur le langage C#/Mono?



Merci

> Lire le message (9 commentaires, moyenne: 1,2).  

Vous avez demandé le commentaire #531597.

Type.GetInterfaces()

Posté par TazForEver () le 05/02/2005 à 11:24. (lien). Évalué à 2.

using System;
using System.Reflection;

public class plugin
{
public static void Main(string[] args)
{
foreach(string path in args)
{
Assembly asm = Assembly.LoadFrom(path);

foreach(Type t in asm.GetTypes())
{
foreach(Type i in t.GetInterfaces())
{
if(i == typeof(System.Collections.ICollection))
{
Console.WriteLine(t);
break;
}
}
}
}
}
}


PS: désolé pour l'indentation de merde, ça fait des années qu'on réclame un balise tt qui fonctionne :o

[ Répondre ]

  • [^]Re: Type.GetInterfaces()

    Posté par jusob () le 05/02/2005 à 17:54. (lien). Évalué à 1.

    Merci pour le code

    if(i == typeof(System.Collections.ICollection))


    Je pense que je dois remplacer cette ligne par:
    if (i == typeof(PluginInterface))

    Mais cela donne toujours fase:
    Console.WriteLine("but this is NOT a plugin ({0}) ({1})", i, typeof(PluginInterface)) =>
    but this is NOT a plugin (PluginInterface) (PluginInterface)

    [ Répondre ]

    • [^]Re: Type.GetInterfaces()

      Posté par TazForEver () le 05/02/2005 à 18:37. (lien). Évalué à 1.

      tu as bien utilisé GetInterfaces() ?

      [ Répondre ]

      • [^]Re: Type.GetInterfaces()

        Posté par jusob () le 05/02/2005 à 19:09. (lien). Évalué à 1.

        // check if this dll inherits PluginInterface
        foreach (Type type in asm.GetTypes())
        {
        // we're interested in the interface
        foreach(Type intrfce in type.GetInterfaces())
        {
        if (intrfce == typeof(PluginInterface))
        {
        Console.WriteLine("and this is a plugin");
        pluginList.Add((PluginInterface) Activator.CreateInstance(type));
        }
        else
        Console.WriteLine("but this is NOT a plugin ({0} != {1})", intrfce, typeof(PluginInterface));
        }
        }

        [ Répondre ]

        • [^]Re: Type.GetInterfaces()

          Posté par jusob () le 05/02/2005 à 20:00. (lien). Évalué à 1.

          pluginList.Add((PluginInterface) Activator.CreateInstance(type));


          Je me rends compte que c'est pas très malin: je veux créer une nouvelle instance d'une interface!!

          Voilà ce que je voulais faire de façon plus générale:
          j'ai un core qui charge des DLL fait par d'autres personnes. Je compte donc mettre à disposition une interface PluginInterface que chaque DLL devrait implémenter.
          Mais je me rends compte que si je veux traiter chaque DLL en tant que PluginInterface, PluginInterface devrait être une classe putôt qu'une interface, non?

          [ Répondre ]

          • [^]Re: Type.GetInterfaces()

            Posté par TazForEver () le 05/02/2005 à 21:07. (lien). Évalué à 1.

            ben si tu veux instancier, il te faut une classe certes, avec soit un constructeur, soit une méthode factory

            [ Répondre ]

            [^]Re: Type.GetInterfaces()

            Posté par TImaniac (page perso, ) le 06/02/2005 à 19:00. (lien). Évalué à 2.

            Je me rends compte que c'est pas très malin: je veux créer une nouvelle instance d'une interface!!
            Non non, tu demandes une instance de "type", qui dans ton code correspond au type concret d'un element, et pas une interface, donc ton morceau de code est tout à fait logique.
            De manière générale tu te retrouveras de toute façon avec un problème récurrent : il faut appeler le constructeur du type concret, et là impossible d'être sûr qu'il y a un constructeur par défaut, une interface ne pouvant spécifier celà (ce qui est fort dommage).
            Voici par ici le code que j'utilise dans un projet pour charger dynamiquement des plugins :
            http://projet.ifsic.univ-rennes1.fr/cgi-bin/viewcvs.cgi/projet/src/(...)

            celà marche nickel.
            Tu remarqueras que je ne créé pas d'instance sur le tas (parcque j'ai besoin d'en faire pleins à d'autres moment), et que donc je me contente de mémoriser le Type trouvé dans une Hashtable.

            Après le principe est exactement le même que ce que tu as proposé, à ceci prêt que j'utilise une classe abstraite (Module) plutôt qu'une interface, mais les 2 auraient été possibles.

            Je pars aussi du principe que mes plugins prennent un argument particulier en constructeur (la classe abstraite réclamant un constructeur spécifique, à défaut de pouvoir l'imposer dans la classes fille le développeur va devoir se demander où trouver ce paramètre et lire la doc :) )

            [ Répondre ]

            • [^]Re: Type.GetInterfaces()

              Posté par jusob () le 06/02/2005 à 21:55. (lien). Évalué à 1.

              Merci. J'ai finalement réussi à (presque!) régler mon problème.

              Je rebondis sur ton code: quel logiciel utilises-tu sous Linux pour extraire la donc de ton source code?

              [ Répondre ]