web-dev-qa-db-fra.com

Appeler explicitement le constructeur statique

Je veux écrire un test unitaire pour la classe inférieure.
Si name est autre que "MyEntity", alors mgr devrait être vide.
Test unitaire négatif  
Utilisation de l’accesseur privé de Manager Je souhaite changer le nom en "Test" afin que mgr soit null. Et puis vérifie la valeur mgr. Pour ce faire, je souhaite appeler explicitement le constructeur statique mais quand j'appelle le constructeur statique en utilisant 

Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null); 

name est toujours défini sur "MyEntity". Comment définir name sur "Test" et appeler le constructeur statique.

public class Manager
{        
        private static string name= "MyEntity";

        private static object mgr;

        static Manager()
        {
            try
            {
                mgr = CreateMgr(name);
            }
            catch (Exception ex)
            {
                mgr=null;
            }
        }
}
26
meetjaydeep

Comme je l'ai découvert aujourd'hui, le constructeur statique peut être appelé directement:

from un autre poste Stackoverflow

Les autres réponses sont excellentes, mais si vous devez forcer un constructeur de classe À s'exécuter sans référence au type (c'est-à-dire. Réflexion), vous pouvez utiliser:

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  

Je devais ajouter ce code à mon application pour contourner un éventuel bogue du .net 4.0 CLR .

33
Tobias Knauss

Si vous avez un membre statique dans votre classe (il doit y en avoir un, sinon le constructeur statique n'en ferait pas trop) alors inutile d'appeler explicitement le constructeur statique.

Accédez simplement à la classe où vous souhaitez appeler son constructeur statique. Par exemple.:

public void MainMethod()
{
    // Here you would like to call the static constructor

    // The first access to the class forces the static constructor to be called.
    object temp1 = MyStaticClass.AnyField;

    // or
    object temp2 = MyClass.AnyStaticField;
}
4
Mitulát báti

Pour tous ceux qui trouvent ce fil et se demandent ... Je viens de faire le test. Il semble que System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor() n'exécutera le constructeur statique que s'il a déjà été pas exécuté pour une autre raison.

Par exemple, si votre code n'est pas positif, que le code précédent ait ou non accédé à la classe et déclenché l'exécution du constructeur statique, cela n'a pas d'importance. Cet accès précédent aura déclenché l'exécution du constructeur statique, mais RunClassConstructor () ne l'exécutera pas également. RunClassConstructor () n'exécute le constructeur statique que s'il n'a pas déjà été exécuté.

L'accès à la classe après RunClassConstructor () entraîne également pas / le constructeur statique est exécuté une seconde fois.

Ceci est basé sur des tests dans une application Win10 UWP.

3
kburgoyne

Mettez le code que vous souhaitez appeler le constructeur dans une méthode publique et appelez-le à partir du constructeur

0
hngr18