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 :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Test_Factory
- {
- delegate ObjectFactory CreateObject();
-
- class Factory
- {
- private SortedDictionary<string, CreateObject> MapObjects = new SortedDictionary<string, CreateObject>();
- public List<string> ListObjects
- {
- get
- {
- return MapObjects.Keys.ToList();
- }
- }
- public bool Register(string ID, CreateObject createObjectDelegate)
- {
- try
- {
- MapObjects.Add(ID, createObjectDelegate);
- }
- catch (ArgumentException exp)
- {
- return false;
- }
- return true;
- }
- }
|
Un objet qui peut-être créé par la factory
Code :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Test_Factory
- {
- class Object1 : ObjectFactory
- {
- private static string Identifier { get { return "Object1"; } }
- public static bool Created = Factory.Instance.Register("Object1", delegate() { return new Object1(); });
- public Object1()
- {
-
- }
- }
- }
|
Pour enregistrer l'objet dans la factory, je suis pour l'instant obligé de le faire manuellement dans le main de l'application:
Code :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Test_Factory
- {
- class Program
- {
- static void Main(string[] args)
- {
- bool f = Object1.Created;
-
- var query = from a in Factory.Instance.ListObjects
- select a;
- foreach (var a in query)
- Console.WriteLine(a);
- Console.Read();
- }
- }
- }
|
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.