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

Метод System.Reflection GetProperties не возвращает значения

Может кто-нибудь объяснить мне, почему метод GetProperties не будет возвращать общедоступные значения, если класс настроен следующим образом.

public class DocumentA
{
    public string AgencyNumber = string.Empty;
    public bool Description;
    public bool Establishment;
}

Я пытаюсь настроить простой способ unit test для воспроизведения с помощью

Метод выглядит следующим образом, и он имеет все необходимые инструкции и ссылки.

Все, что я делаю, вызывает следующее, но возвращает 0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance);

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

Причина, по которой я не настраивал класс в старой школе, состоял в том, что он имеет 61 свойство, и это увеличит мои строки кода, по крайней мере, в три раза. Я был бы кошмаром для обслуживания.

4b9b3361

Ответ 1

Вы не объявили никаких свойств - вы объявили поля. Здесь аналогичный код со свойствами:

public class DocumentA
{
    public string AgencyNumber { get; set; }
    public bool Description { get; set; }
    public bool Establishment { get; set; }

    public DocumentA() 
    {
        AgencyNumber = "";
    }
}

Я бы настоятельно советовал вам использовать свойства, как указано выше (или, возможно, с более ограниченными сеттерами) вместо того, чтобы просто менять Type.GetFields. Публичные поля нарушают инкапсуляцию. (Public mutable properties невелики на фронте инкапсуляции, но по крайней мере они дают API, реализация которого может быть изменена позже.)

Ответ 2

Так как теперь вы объявили свой класс, используйте "Поля". Если вы хотите получить доступ к полям для отражения, вы должны использовать Type.GetFields() (см. Метод Types.GetFields 1)

Теперь я не использую ту версию С#, которую вы используете, но синтаксис свойства изменился в С# 2 на следующее:

public class Foo
{
  public string MyField;
  public string MyProperty {get;set;}
}

Разве это не помогло бы уменьшить количество кода?

Ответ 3

Я вижу, что этой теме уже четыре года, но тем не менее я был неудовлетворен полученными ответами. OP должен заметить, что OP относится к полям не свойства. Для динамического reset все поля (подтверждение расширения) попробуйте:

/**
 * method to iterate through Vehicle class fields (dynamic..)
 * resets each field to null
 **/
public void reset(){
    try{
        Type myType = this.GetType(); //get the type handle of a specified class
        FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class
        for (int pointer = 0; pointer < myfield.Length ; pointer++){
            myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null
        }
    }
    catch(Exception e){
        Debug.Log (e.Message); //prints error message to terminal
    }
}

Обратите внимание, что GetFields() имеет только доступ к общедоступным полям по понятным причинам.

Ответ 4

Как уже упоминалось, это поля не свойства. Синтаксис свойства:

public class DocumentA  { 
    public string AgencyNumber { get; set; }
    public bool Description { get; set; }
    public bool Establishment { get; set;}
}