c# - una - Llamar explícitamente constructor estático
llamar una clase en c# (4)
Coloque el código que desea llamar en el constructor en un método público y llámelo desde el constructor
Quiero escribir la prueba de unidad para la clase inferior.
Si el nombre no es "MyEntity", entonces mgr debe estar en blanco.
Prueba de unidad negativa
Usando el gestor de acceso privado, quiero cambiar el nombre a "Prueba" para que mgr sea nulo. Y luego verificará el valor mgr. Para lograr esto, quiero llamar explícitamente al constructor estático, pero cuando llamo al constructor estático usando
Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null);
name siempre se establece en "MyEntity", como configurar el nombre en "Test" e invocar el constructor estático.
public class Manager
{
private static string name= "MyEntity";
private static object mgr;
static Manager()
{
try
{
mgr = CreateMgr(name);
}
catch (Exception ex)
{
mgr=null;
}
}
}
Como descubrí hoy, el constructor estático PUEDE ser llamado directamente:
de otro post de
Las otras respuestas son excelentes, pero si necesita forzar la ejecución de un constructor de clase sin tener una referencia al tipo (es decir, reflexión), puede usar:
Type type = ...; System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
Tuve que agregar este código a mi aplicación para solucionar un posible error en el CLR .net 4.0 .
Para cualquiera que encuentre este hilo y se pregunte ... acabo de hacer la prueba. Parece que System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor()
solo ejecutará el constructor estático si aún no se ha ejecutado por otro motivo.
Por ejemplo, si su código no es positivo si el código anterior pudo haber accedido a la clase y activado el constructor estático, no importa. Ese acceso anterior habrá activado el constructor estático para ejecutarse, pero luego RunClassConstructor () tampoco lo ejecutará. RunClassConstructor () solo ejecuta el constructor estático si aún no se ha ejecutado.
El acceso a la clase después de RunClassConstructor () tampoco hace que el constructor estático se ejecute por segunda vez.
Esto se basa en pruebas en una aplicación Win10 UWP.
Si tiene un miembro estático en su clase (debe haberlo, de lo contrario el constructor estático no haría demasiado), entonces no es necesario llamar explícitamente al constructor estático.
Simplemente acceda a la clase a la que le gustaría llamar a su constructor estático. P.ej:
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;
}