Подтвердить что ты не робот

С# - получение значений статических свойств из статического класса

Я пытаюсь пропустить некоторые статические свойства в простом статическом классе, чтобы заполнить поле со списком со своими значениями, но у меня возникают трудности.

Вот простой класс:

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

... и код, пытающийся получить значения:

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

Если я не снабжу флагов привязки, я получаю около 57 свойств, включая такие вещи, как System.Reflection.Module Module и всевозможные другие унаследованные вещи, которые мне не нужны. Мои 3 объявленные свойства отсутствуют.

Если я поставляю различные комбинации других флагов, он всегда возвращает 0 свойств. Отлично.

Имеет ли значение, что мой статический класс фактически объявлен в другом нестатическом классе?

Что я делаю неправильно?

4b9b3361

Ответ 1

Проблема заключается в том, что property1..3 не являются свойствами, а полями.

Чтобы сделать их свойства, измените их на:

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

Или используйте автоматические свойства и инициализируйте их значения в статическом конструкторе класса:

public static string property1 { get; set; }

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

... или используйте myType.GetFields(...), если поля - это то, что вы хотите использовать.

Ответ 2

Попробуйте удалить BindingFlags.DeclaredOnly, потому что согласно MSDN:

Указывает, что объявлены только участники на уровне поставляемого типа следует рассмотреть иерархию. Унаследованные члены не учитываются.

Так как статические не могут быть унаследованы, это может вызвать проблемы. Также я заметил, что поля, которые вы пытаетесь получить, не являются свойствами. Поэтому попробуйте использовать

type.GetFields(...)