system.reflection问题,GetFields没有返回所有内容

时间:2016-08-01 16:56:54

标签: c# oop system.reflection bindingflags

我对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 个答案:

答案 0 :(得分:4)

那是因为它是属性而不是字段。

=>是一个属性的getter的语法糖。所以它是公平的:

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

所以你需要使用.GetProperties(flags)

答案 1 :(得分:2)

好吧,分析这行代码:

public int CalculationResult => Weight * Height;

也可以简化为(没有C#6.0语法糖):

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

编译器没有创建支持字段,因为它不是自动属性,这就是为什么它不在反射调用从类中检索的字段中。

如果您将其更改为public int CalculationResult { get; },则会创建该字段,该字段将显示在列表中。