Метод 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 свойство, и это увеличит мои строки кода, по крайней мере, в три раза. Я был бы кошмаром для обслуживания.
Ответы
Ответ 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;}
}