2011-10-20 10 views
22

¿Puede alguien explicarme por qué el método GetProperties no devolvería los valores públicos si la clase se configura de la siguiente manera.Método System.Reflection GetProperties que no devuelve los valores

public class DocumentA 
{ 
    public string AgencyNumber = string.Empty; 
    public bool Description; 
    public bool Establishment; 
} 

estoy tratando de configurar un método de prueba de unidad sencilla de jugar con

El método es el siguiente y tiene todo el apropiado uso de declaraciones y referencias.

Todo lo que estoy haciendo es llamando al siguiente pero devuelve 0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

Pero si I fijó la clase con miembros privados y propiedades públicas que trabaja muy bien.

La razón por la que no configuré la clase de la vieja escuela fue porque tiene 61 propiedades y hacer eso aumentaría mis líneas de código al menos para triplicar eso. Sería una pesadilla de mantenimiento.

+2

Es un poco obvio, la clase no tiene ninguna propiedad. Solo campos La pesadilla comenzó cuando permitiste que la clase explotara así. Usar campos públicos cuesta más horas de sueño. –

Respuesta

44

No ha declarado ninguna propiedad - ha declarado campos. Esto es un código similar con propiedades:

public class DocumentA 
{ 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set; } 

    public DocumentA() 
    { 
     AgencyNumber = ""; 
    } 
} 

Yo te aconsejaría fuertemente utilizar propiedades que el anterior (o, posiblemente, con los emisores más restringidos) en lugar de simplemente cambiar a utilizar Type.GetFields. Los campos públicos violan la encapsulación. (Las propiedades mutables públicas no son geniales en el frente de encapsulación, pero al menos dan una API, cuya implementación se puede cambiar más adelante).

+0

Estoy completamente de acuerdo con el uso de propiedades en lugar de campos. Simplemente no sabía la sintaxis correcta. Normalmente declaro campos privados y buscadores y establecedores públicos. Mi problema fue que pensé que estaba usando propiedades cuando en realidad me faltaba {get, set}. Gracias por la aclaración. – gsirianni

+0

Esta respuesta realmente me ayudó –

4

Porque la forma en que ha declarado su clase ahora está usando Fields. Si desea acceder a los campos a través del reflejo, debe usar Type.GetFields() (vea Types.GetFields Method 1)

No sé ahora qué versión de C# está usando pero la sintaxis de la propiedad ha cambiado en C# 2 a lo siguiente:

public class Foo 
{ 
    public string MyField; 
    public string MyProperty {get;set;} 
} 

¿No ayudaría esto a reducir la cantidad de código?

+0

Gracias por su respuesta. Solo tenía mi sintaxis codificada. Normalmente no declaro propiedades de esta manera.La mayoría de los tiem tengo propiedades públicas con campos privados correspondientes. – gsirianni

+2

¿Pero por qué? Usando la sintaxis de mano corta compila a la misma IL. El compilador genera el campo backend para usted. Solo necesita la sintaxis más elaborada cuando desee hacer algún otro procesamiento en el captador o instalador. –

0

Como se mencionó, estos son campos, no propiedades. La sintaxis de la propiedad sería:

public class DocumentA { 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set;} 
} 
1

Veo este hilo ya tiene cuatro años, pero sin embargo yo estaba insatisfecho con las respuestas proporcionadas. OP debe tener en cuenta que OP se refiere a Campos no Propiedades. Para restablecer todos los campos (de forma dinámica a prueba de expansión) Proveedores:

/** 
* method to iterate through Vehicle class fields (dynamic..) 
* resets each field to null 
**/ 
public void reset(){ 
    try{ 
     Type myType = this.GetType(); //get the type handle of a specified class 
     FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class 
     for (int pointer = 0; pointer < myfield.Length ; pointer++){ 
      myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null 
     } 
    } 
    catch(Exception e){ 
     Debug.Log (e.Message); //prints error message to terminal 
    } 
} 

Tenga en cuenta que GetFields() sólo tiene acceso a los campos públicos por razones obvias.

+0

Esta respuesta responde a la pregunta inicial en los campos, incluso si el autor estaba usando erróneamente GetProperties() en los campos. ¡Gracias! –

Cuestiones relacionadas