C # GetProperties () не возвращает их все - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть эти классы

class Foo () {
 public string propA;
 public Bar propB
}

class Bar {
 public string propC;
}

Когда я пытаюсь Foo.GetType().GetProperties(), он возвращает только propA.

Что мне здесь не хватает;

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

В этом случае оба класса имеют поля. Итак, вам нужно использовать GetType().GetFields().

class Foo {
 public string propA;
 public Bar propB;
}

class Bar {
 public string propC;
}

Если вы хотите использовать GetType().GetProperties(), тогда классы станут:

class Foo {
 private string _propA;
 public string PropA { get { return _propA; } set { _propA= value; } }

 private Bar _propB;
 public Bar PropB { get { return _propB; } set { _propB= value; } }
}

class Bar {
 public string propC;
}
0 голосов
/ 01 ноября 2018

Вам нужно понять разницу между Полем и Свойством, в этом ответе есть хорошее объяснение: https://stackoverflow.com/a/295109/929910

И ваш пример также выглядит странно, потому что GetProperties должен возвращать 0 результатов, поскольку у вашего класса есть только поля, а не свойства. Правильный пример будет выглядеть так:

void Main()
{
    var props = typeof(Foo).GetProperties();
}
class Foo {
    public string propA;
    public Bar propB;
}
class Bar
{
    public string propC;
}

И реквизит будет содержать 0 элементов. Но если бы вы позвонили

    var fields = typeof(Foo).GetFields();

поля будут содержать оба поля propA и propB.

0 голосов
/ 01 ноября 2018

Ваш класс в настоящее время содержит поля, а не свойства.

Пример поля:

private string _myField;

Примеры объектов:

public string MyField {get;set;}
public string MyField { get { return _myField; } set { _myField = value; } }
public string MyField => _myField;

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

foreach (var field in type.GetFields())
{

}

foreach (var property in type.GetProperties())
{

}

или вы можете получить «членов», и для каждого участника определить, является ли это свойство или поле:

foreach (var member in type.GetMembers(System.Reflection.BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.GetField))
{
    if (member is FieldInfo fi)
    {

    }
    else if (member is PropertyInfo pi)
    {

    }
}

** Если вы хотите найти свойства или поля, вы можете установить , вам может потребоваться изменить флаги привязки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...