Проблема с 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; }
это создаст поле, и оно будет отображаться в списке.