2009-09-28 22 views
39

Estoy intentando recorrer algunas propiedades estáticas en una clase estática simple para rellenar un cuadro combinado con sus valores, pero estoy teniendo dificultades.C# - Obtener valores de propiedades estáticas de la clase estática

Aquí está la clase simple:

public static MyStaticClass() 
{ 
    public static string property1 = "NumberOne"; 
    public static string property2 = "NumberTwo"; 
    public static string property3 = "NumberThree"; 
} 

... y el código de intentar recuperar los valores:

Type myType = typeof(MyStaticClass); 
PropertyInfo[] properties = myType.GetProperties(
     BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly); 
foreach (PropertyInfo property in properties) 
{ 
    MyComboBox.Items.Add(property.GetValue(myType, null).ToString()); 
} 

Si no realizamos ningún banderas de unión en cuando me siento cerca de 57 propiedades que incluyen cosas como System.Reflection.Module Module y todo tipo de otras cosas heredadas. No me importa. Mis 3 propiedades declaradas no están presentes.

Si proporciono varias combinaciones de otros indicadores, siempre devuelve 0 propiedades. Estupendo.

¿Importa que mi clase estática realmente se declare dentro de otra clase no estática?

¿Qué estoy haciendo mal?

+1

@Veverke: Teniendo en cuenta que el OP cometió ese error, otras personas también lo hacen, por lo que mantener la terminología incorrecta es crucial para garantizar que Google pueda encontrar la publicación. Tal edición destruye la pregunta, ya que no queda ninguna pregunta después de hacer esa edición. –

Respuesta

51

El problema es que property1..3 no son propiedades, sino campos.

Para hacerlos propiedades ellas cambian a:

private static string _property1 = "NumberOne"; 
public static string property1 
{ 
    get { return _property1; } 
    set { _property1 = value; } 
} 

o utilizar las propiedades de auto e inicializar sus valores en el constructor estático de la clase:

public static string property1 { get; set; } 

static MyStaticClass() 
{ 
    property1 = "NumberOne"; 
} 

... o utiliza myType.GetFields(...) si los campos son lo que quieres usar

+0

Estoy usando algo como: \t var type = new Foo(). GetType(); var value = type.GetField ("Campo1"). GetValue (nuevo Foo()); Console.WriteLine (valor); ¿Eso parece correcto? –

5

Trate de no incluir BindingFlags.DeclaredOnly, porque de acuerdo con MSDN:

Especifica que sólo los miembros declararon a nivel de la jerarquía de tipo suministrado debe ser considerado. No se consideran miembros heredados.

Dado que no se pueden heredar los estáticos, esto podría estar causando sus problemas. También noté que los campos que intentas obtener no son propiedades. Intente utilizar

Cuestiones relacionadas