C#GetProperties()不会全部返回

时间:2018-11-01 06:15:24

标签: c# reflection

我有这些课程

class Foo () {
 public string propA;
 public Bar propB
}

class Bar {
 public string propC;
}

当我尝试Foo.GetType().GetProperties()时,它只会返回propA。

我在这里想念什么?

3 个答案:

答案 0 :(得分:3)

您的班级当前包含字段,而不是属性。

字段示例:

private string _myField;

属性示例:

public string MyField {get;set;}
public string MyField { get { return _myField; } set { _myField = value; } }
public string MyField => _myField;

由于它们是不同的事物,因此有不同的方法来反映它们。您可以分别获取字段和属性:

foreach (var field in type.GetFields())
{

}

foreach (var property in type.GetProperties())
{

}

或者您可以获取“成员”,并为每个成员确定它是属性还是字段:

foreach (var member in type.GetMembers(System.Reflection.BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.GetField))
{
    if (member is FieldInfo fi)
    {

    }
    else if (member is PropertyInfo pi)
    {

    }
}

**如果要查找可以设置的属性或字段,则可能需要更改绑定标志。

请注意,从设计角度来看,字段可能应该被保护或私有。要公开类中的数据,理想情况下,应使用属性。 here的更多内容。

答案 1 :(得分:2)

您需要了解字段和属性之间的区别,此答案有一个很好的解释:https://stackoverflow.com/a/295109/929910

您的示例也看起来很奇怪,因为GetProperties应该返回0结果,因为您的类仅具有字段而没有属性。 正确的示例如下所示:

void Main()
{
    var props = typeof(Foo).GetProperties();
}
class Foo {
    public string propA;
    public Bar propB;
}
class Bar
{
    public string propC;
}

道具将包含0个元素。 但是如果你愿意打电话

    var fields = typeof(Foo).GetFields();

字段将包含字段propA和propB。

答案 2 :(得分:1)

在这种情况下,两个类都有字段。因此,您需要使用GetType().GetFields()

class Foo {
 public string propA;
 public Bar propB;
}

class Bar {
 public string propC;
}

如果您想使用GetType().GetProperties(),则这些类将变为:

class Foo {
 private string _propA;
 public string PropA { get { return _propA; } set { _propA= value; } }

 private Bar _propB;
 public Bar PropB { get { return _propB; } set { _propB= value; } }
}

class Bar {
 public string propC;
}