2010-02-24 19 views
19

Tengo un static class con static private readonly miembro que se establece a través de la clase static constructor. A continuación se muestra un ejemplo simplificado.¿Es posible configurar este miembro privado estático de una clase estática con reflexión?

public static class MyClass 
{ 
    private static readonly string m_myField; 

    static MyClass() 
    { 
     // logic to determine and set m_myField; 
    } 

    public static string MyField 
    { 
     get 
     { 
      // More logic to validate m_myField and then return it. 
     } 
    } 
} 

Puesto que la clase anterior es una clase estática, no puede crear una instancia de la misma con el fin de utilizar tal extremo en una llamada FieldInfo.GetValue() para recuperar y posteriormente establece el valor de m_myField. ¿Hay alguna manera de que no sepa utilizar la clase FieldInfo para obtener y establecer el valor en una clase estática o la única opción es refactorizar la clase que me pidieron que haga la prueba unitaria?

+3

¿Por qué ¿Quieres una instancia para obtener información de reflexión? simplemente diga 'typeof (MyClass)' y listo, vaya a los bits divertidos de la API de reflexión ... – flq

+0

+1 y aceptaría la respuesta si fuera así ya que no me daba cuenta de que se podía usar un Tipo en Get/SetValue y no tiene que ser una instancia de la clase en sí. Gracias – JamesEggers

Respuesta

32

Aquí está un ejemplo rápido que muestra cómo hacerlo:

using System; 
using System.Reflection; 

class Example 
{ 
    static void Main() 
    { 
     var field = typeof(Foo).GetField("bar", 
          BindingFlags.Static | 
          BindingFlags.NonPublic); 

     // Normally the first argument to "SetValue" is the instance 
     // of the type but since we are mutating a static field we pass "null" 
     field.SetValue(null, "baz"); 
    } 
} 

static class Foo 
{ 
    static readonly String bar = "bar"; 
} 
+0

¿Es esto una violación del control de acceso "privado"? – athos

+10

En general, cada vez que usas la reflexión es una violación de alguna ley :) – SamuelWarren

0

Esta "regla nula" también se aplica a FieldInfo.GetValue() para un campo estático, por ejemplo,

Console.Writeline((string)(field.GetValue(null))); 
+0

FYI - esto debería haber sido un comentario a la respuesta original. Esto se publicó como una respuesta y no responde directamente a la pregunta original, que era cómo establecer un valor en un miembro estático. Esta es una buena información para compartir, solo debería haber sido un comentario sobre la respuesta que explica cómo resolver el problema original de OPs –

Cuestiones relacionadas