2016-08-01 1 views
1

У меня есть проблема с System.Reflection. Пожалуйста, смотрите прилагаемый код:Проблема с system.reflection, GetFields не возвращает все

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 собственности. Я предполагаю, что мне нужен другой флаг, но я не могу понять, какой он есть.

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

ответ

4

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

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

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

Таким образом, вы должны использовать .GetProperties(flags)

+0

Да, это имеет смысл, и это тоже работает, огромное спасибо! – ASMoncrieff

+0

и спасибо, что ознакомили меня со словом «синтаксический сахар», я буду использовать его больше в разговоре – ASMoncrieff

2

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

public int CalculationResult => Weight * Height; 

, который также может быть упрощена (без C# 6,0 синтаксический сахар):

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

Компилятор не создает поле поддержки, потому что оно не авто -property, и именно поэтому он не относится к полям, извлеченным из класса вызовами отражения.

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

Смежные вопросы