views:

1545

answers:

2

I'm trying to loop through some static properties in a simple static class in order to populate a combo box with their values, but am having difficulties.

Here is the simple class:

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

... and the code attempting to retrieve the values:

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());
}

If I don't supply any binding flags then I get about 57 properties including things like System.Reflection.Module Module and all sorts of other inherited things I don't care about. My 3 declared properties are not present.

If I supply various combinations of other flags then it always returns 0 properties. Great.

Does it matter that my static class is actually declared within another non-static class?

Please help! What am I doing wrong?

+18  A: 

The problem is that property1..3 are not properties, but fields.

To make them properties change them to:

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

Or use auto properties and initialize their values in the static constructor of the class:

public static string property1 { get; set; }

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

...or use myType.GetFields(...) if fields are what you want to use.

M4N
Brilliant. Thankyou!
JamesW
+2  A: 

Try removing BindingFlags.DeclaredOnly, because according to MSDN:

Specifies that only members declared at the level of the supplied type's hierarchy should be considered. Inherited members are not considered.

Since static's cannot be inherited, this might be causing your issues. Also I noticed the fields you are trying to get are not properties. So try using

type.GetFields(...)
Nick Berardi