С# - получение значений статических свойств из статического класса
Я пытаюсь пропустить некоторые статические свойства в простом статическом классе, чтобы заполнить поле со списком со своими значениями, но у меня возникают трудности.
Вот простой класс:
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 свойств. Отлично.
Имеет ли значение, что мой статический класс фактически объявлен в другом нестатическом классе?
Что я делаю неправильно?
Ответы
Ответ 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(...)