Initialiser une variable statique au démarrage de l'application
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 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:
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:
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.