Initialiser une variable statique au démarrage de l'application

Initialiser une variable statique au démarrage de l'application - C#/.NET managed - Programmation

Marsh Posté le 14-04-2008 à 13:56:38    

Bonjour à tous,
 
j'ai vu dans la MSDN qu'une variable statique est initialisée lorsque le CLR charge la classe/namespace qui contient la variable.
 
Comment est-ce que je peux faire comme en  C++ où les variables statiques sont chargées lorsque l'application se lance?
 
Je voudrais faire une factory où les objets qui peuvent être créés se chargent eux-même dans la factory, sans qu'on ait besoin d'ajouter manuellement les objets dans le code de la factory.
 
Voici le code que j'ai actuellement:
 
La factory:
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Test_Factory
  6. {
  7.     delegate ObjectFactory CreateObject();
  8.  
  9.     class Factory
  10.     {
  11.         private SortedDictionary<string, CreateObject> MapObjects = new SortedDictionary<string, CreateObject>();
  12.         public List<string> ListObjects
  13.         {
  14.             get
  15.             {
  16.                 return MapObjects.Keys.ToList();
  17.             }
  18.         }
  19.         public bool Register(string ID, CreateObject createObjectDelegate)
  20.         {
  21.             try
  22.             {
  23.                 MapObjects.Add(ID, createObjectDelegate);
  24.             }
  25.             catch (ArgumentException exp)
  26.             {
  27.                 return false;
  28.             }
  29.             return true;
  30.         }     
  31.     }


 
 
Un objet qui peut-être créé par la factory
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Test_Factory
  6. {
  7.     class Object1 : ObjectFactory
  8.     {
  9.         private static string Identifier { get { return "Object1"; } }
  10.         public static bool Created = Factory.Instance.Register("Object1", delegate() { return new Object1(); });
  11.         public Object1()
  12.         {
  13.            
  14.         }       
  15.     }
  16. }


 
 
Pour enregistrer l'objet dans la factory, je suis pour l'instant obligé de le faire manuellement dans le main de l'application:
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Test_Factory
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             bool f = Object1.Created;
  12.            
  13.             var query = from a in Factory.Instance.ListObjects
  14.                         select a;
  15.             foreach (var a in query)
  16.                 Console.WriteLine(a);
  17.             Console.Read();
  18.         }
  19.     }
  20. }


 
Des idées?
 
Merci d'avance
 
PS: j'ai pour l'instant une solution qui fonctionne à base de réflection, mais je suis assez circonspect vis à vis des performances ou de l'efficacité de cette solution.

Reply

Marsh Posté le 14-04-2008 à 13:56:38   

Reply

Marsh Posté le 21-04-2008 à 19:29:58    

Ah mon avis, la seule solution est d'utiliser la reflexion effectivement.
Soit à partir d'un attribut, soit à partir d'une classe de base (critère de sélection des classes à ajouter).
Ensuite il faut parcourir tes assemblys et ajouter chaque classe.


---------------
Distributeurs automatiques à proximité | Jupiteo - Création et optimisation d'application web
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed