2016-08-01 22 views
1

Ich habe ein kleines Problem mit System.Reflection. Bitte beachten Sie die beigefügten Code:Problem mit system.reflection, GetFields nicht alles zurück

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() 
    { 

    } 
} 

Es scheint, als ob die getfields Methode ist nicht die berechnete Eigenschaft CalculationResult bekommen. Ich nehme an, dass es eine andere Flagge gibt, die ich benutzen muss, aber ich kann nicht herausfinden, welche es ist.

Vielen Dank im Voraus und ich werde gerne weitere Informationen zur Verfügung stellen, wenn nötig.

Antwort

4

Das ist, weil es eine Eigenschaft und kein Feld ist.

=> ist ein syntaktischer Zucker für einen Getter, der eine Eigenschaft ist. So ist es equivelant zu:

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

So müssen Sie .GetProperties(flags)

+0

Aah, das macht Sinn, und das funktioniert auch, vielen Dank! – ASMoncrieff

+0

und danke, dass Sie mich mit dem Ausdruck "syntaktischer Zucker" bekannt gemacht haben, ich werde ihn eher im Gespräch verwenden – ASMoncrieff

2

Gut verwenden, diese Codezeile zu analysieren:

public int CalculationResult => Weight * Height; 

die auch vereinfacht werden können (ohne C# 6.0 syntaktischen Zucker):

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

Der Compiler erstellt kein Hintergrundfeld, da es nicht automatisch ist - Eigenschaft und deshalb gehört es nicht zu den Feldern, die durch Reflektionsaufrufe aus der Klasse abgerufen werden.

Wenn Sie es in public int CalculationResult { get; } ändern, wird das Feld erstellt und es wird in der Liste angezeigt.