Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] meta-classe comme en Python

    7 novembre 2011 à 10:12:46

    Bonjour,

    En python j'aime bien utilisé le système de meta-classe pour faire la chose suivante :
    Par exemple j'ai une classe abstraite qui s'ajoute automatiquement dans une table de hashage avec pour clé son nom. Et toute les classes qui héritent de cette classe abstraite en font de même.
    C'est super pratique.
    Il y a ici un exemple sur un de mes anciens post ici.

    Quelqu'un sait si c'est possible de faire quelque chose de plus ou moins équivalent en C# ?

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      7 novembre 2011 à 11:00:24

      Le C# n'est pas un langage dynamique, donc on ne peut pas créer de meta-classes comme en Python. Par contre, il est possible de consulter les types (classes et autres) disponibles, de lister leurs membres avec leurs [Attributs] etc grâce à la Reflection.

      Cela permet notamment de mettre en place un système de plugins comme celui que tu décris dans ton post. On peut le faire à la main (voir par exemple ce topic), mais le mieux est de passer par un framework adapté qui repose sur un système d'injection de dépendances.

      MEF et Unity sont deux exemples de frameworks qui servent à maintenir un genre de "dictionnaire" comme celui que tu as fait en python. MEF est d'ailleurs conçu à la base pour mettre en place un système de plugins.

      Par exemple si tu as définis une interface IReader, tu peux configurer ces "dictionnaires" puis les consulter (en passant de préférence par un Service Locator) pour récupérer une instance de chaque classe qui implémente IReader :

      IEnumerable<IReader> allReaders = ServiceLocator.Current.GetAllInstances<IReader>();
      


      Qu'as-tu besoin de faire en C# ? :) Selon tes besoins, tu peux opter pour l'une ou l'autre solution.
      • Partager sur Facebook
      • Partager sur Twitter

      [C#] meta-classe comme en Python

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown