Проблема с system.reflection, GetFields не возвращает все

У меня есть небольшая проблема с System.Reflection. Пожалуйста, смотрите прикрепленный код:

class Program
{
    public static FieldInfo[] ReflectionMethod(object obj)
    {
        var flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly;
        return obj.GetType().GetFields(flags);
    }
        static void Main()
    {
        var test = new Test() { Id = 0, Age = 12, Height = 24, IsSomething = true, Name = "Greg", Weight = 100 };
        var res = ReflectionMethod(test);
    }
}

    public class Test
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsSomething { get; set; }
    public int Weight { get; set; }
    public int Height { get; set; }
    public int CalculationResult => Weight * Height;

    public Test()
    {

    }
}

Кажется, что метод getfields не получает вычисляемое свойство CalculationResult. Я предполагаю, что есть еще один флаг, который мне нужно использовать, но я не могу понять, какой это флаг.

Спасибо заранее, и я с радостью предоставлю больше информации, если это необходимо.

2 ответа

Решение

Это потому, что это свойство, а не поле.

=> является синтаксическим сахаром для добытчика, который является свойством. Так что это равнозначно:

public int CalculationResult 
{ 
   get 
   { 
      return Weight * Height; 
   }
}

Так что вам нужно использовать .GetProperties(flags)

Хорошо, анализируя эту строку кода:

public int CalculationResult => Weight * Height;

Что также можно упростить до (без синтаксического сахара C# 6.0):

public int CalculationResult {get { return Weight*Height; } }

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

Если вы измените его на public int CalculationResult { get; } это создаст поле, и оно будет отображаться в списке.

Другие вопросы по тегам