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 : 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
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 : 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
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 : 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
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.