2009-09-28 2 views
39

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

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

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

@Veverke: Учитывая, что ОП совершил эту ошибку, другие люди могут тоже, поэтому сохранение неправильной терминологии имеет решающее значение, чтобы гарантировать, что Google сможет найти сообщение. Такое редактирование уничтожает вопрос, так как после внесения этого изменения нет вопросов. –

ответ

51

Проблема в том, что 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(...) если поля это то, что вы хотите использовать.

+0

Я использую что-то вроде: \t var type = new Foo(). GetType(); var value = type.GetField ("Field1"). GetValue (новый Foo()); Console.WriteLine (значение); Кажется, все в порядке? –

5

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

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

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

type.GetFields(...)