Метод GetProperties System.Reflection не возвращает значения - PullRequest
23 голосов
/ 20 октября 2011

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

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

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

Этот метод выглядит следующим образом и имеет все соответствующие операторы и ссылки.

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

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

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

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

Ответы [ 4 ]

49 голосов
/ 20 октября 2011

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

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

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

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

4 голосов
/ 20 октября 2011

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

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

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

Не поможет ли это уменьшить объем кода?

2 голосов
/ 05 февраля 2016

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

/**
 * 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 () имеет доступ к открытым полям только по очевидным причинам.

1 голос
/ 20 октября 2011

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

public class DocumentA  { 
    public string AgencyNumber { get; set; }
    public bool Description { get; set; }
    public bool Establishment { get; set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...