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 :

[C# 1.0]Comment acceder à membre statique via Reflection ?


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut [C# 1.0]Comment acceder à membre statique via Reflection ?
    Salut,

    Je voudrais acceder a un mebre statique d'un classe d'apres le nom de la classe.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
       public abstract ClassMereFactory 
        {
            public void Do() 
            {
                ..
            }
        }
     
        public class ClassFille1Factory : ClassMereFactory 
        {
            private ClassFilleFactory() : base("fr.MonProjet.Gravite") {}
     
            private static ClassFilleFactory instance = null;
            private static Object instanceLock = new Object();
            public static ClassFilleFactory Instance  
            {
                get 
                {
                    if(instance == null) 
                    {
                        lock(instanceLock) 
                        {
                            if(instance == null) 
                            {
                                instance = new ClassFilleFactory();
                            }
                        }
                    }
     
                    return instance;    
                }        
            }
        }
     
        public class ClassFille2Factory : ClassMereFactory 
        {
             ..
        }
    Le but étant de faire un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ClassMereFactory f;
    f = ????("ClassFille1Factory");
    f.Instance.Do();

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Deux pistes pour faire plus simple :

    1) Activator.CreateInstance() permet de créer des objets à partir du type Utilise Type.GetType() pour obtenir le type à partir du nom de classe

    2)Utiliser les generics

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut
    1) Justement je ne crée pas d'instance, car mes classes sont des singletons d'ou l'acces à un membre static (enfin une membre property)

    2)Les generics c'est dans le fw 2.0 hors je suis en fw 1.0 (on choisi pas toujours les outils avec lesquelles on bosse )

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    A priori tu peux créer autant d'instances que tu veux puisqu'elles accèdent toutes au même membre static.

    Il me semble qu'on peut initialiser un static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static ClassFilleFactory instance = new ClassFilleFactory();

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut
    J'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                oFactory = factoryType.GetProperty("Instance", BindingFlags.Static Or BindingFlags.Public).GetValue(Nothing, Nothing)
    çà fonctionne, le pb c'est que je narrive pas à charger le type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      factoryType = Type.GetType(factoryName, True, True)
    çà ne fonctionne pas car mon type n'estr pas dans l'assemby courant, mais un autre assemby de la solution, donc chargé en memoire.
    Faut que j'arrive à recuperer ce type!

    Help

  6. #6
    Membre averti
    Inscrit en
    Août 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 19
    Par défaut
    Si j'ai bien compris tu as plusieurs classe de type ClasseFilleFactory et tu ne veux qu'une seule instance de chacune de ces classes ?

    Pour faire cela tu n'es peut-être pas obligé de les implémenter comme des singletons. Tu peux par exemple créer une classe ClasseFilleFactoryFactory qui serait un singleton et qui gérerait les instances des classes ClasseFilleFactory par exemple dans un dictionnaire. Cette classe aurait une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public ClasseMereFactory LireClasseFille(string nomClasseFille)
    {
       // si nomClasseFille pas dans le dictionnaire l'instancier par réflexion
       // et l'ajouter dans le dictionnaire et le renvoyer
    }
    et pour l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClassMereFactory f;
    f = ClasseFilleFactoryFactory.Instance.LireClasseFille("ClassFille1Factory");
    f.Do();

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Tu peux aussi utiliser des membres static pour contenir tous les singletons dans une seule classe.
    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
     
        //classe de base (mère)
        public abstract class BaseFactory
            {
            public BaseFactory(string s) {}
            public abstract void Do();
            }
        //conteneur des singletons
        public class Factory
            {
            //classe dérivée (fille)
           private class FilleFactory1 : BaseFactory{
                public FilleFactory1() : base("initFactory1") {}
               public override void Do() {} 
               }
            //singleton 1
            private static FilleFactory1 _factory1 = new FilleFactory1();
            //property d'accès au singleton 1
            public static BaseFactory Factory1 {
                get {return _factory1;}
                }
            }
    Pour l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Factory.Factory1.Do();

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut
    Merci pour tes réponse interessante, mais disons que j'ai pas mal de classe déjà presente, que j'ai la flemme de modifié (et un peu peur des effet de bord).
    Du coup j'ai fait, une methode public dans mon assembly pour le recuperer et c'est Ok.

    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
     
        Private Function ExtractCritere(ByVal typeCritere As String, ByVal valCritere As String) As ClassMere
            Dim oFactory As Object
            Dim factory As ClassMereFactory 
            Dim factoryType As Type
            Dim ret As ClassMere
            Try
                ' recupere le type du critere
                factoryType = fr.MonProjet.TypeHelper.GetType(Request.Params(typeCritere) + "Factory")
     
                'recupere l'instance de ma factory du critere
                oFactory = factoryType.GetProperty("Instance", BindingFlags.Static Or BindingFlags.Public).GetValue(Nothing, Nothing)
                factory = CType(oFactory, ClassMereFactory)
     
                'le critere instancier
                ret = factory.getFromCode(Request.Params(valCritere))
            Catch
                ret = Nothing
            End Try
     
            Return ret
        End Function
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractCritere("typeCritere","valueCritere").Do()

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

Discussions similaires

  1. Comment acceder à mon routeur via python ?
    Par newsuser dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 28/11/2011, 21h53
  2. Comment acceder a un webservice via du javascript ?
    Par arioule dans le forum Services Web
    Réponses: 2
    Dernier message: 09/09/2008, 12h33
  3. Réponses: 4
    Dernier message: 20/10/2006, 16h19
  4. Réponses: 6
    Dernier message: 22/09/2006, 13h31
  5. Réponses: 1
    Dernier message: 18/08/2006, 10h34

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