C#GetProperties()不会返回所有属性

C#GetProperties()不会返回所有属性,c#,reflection,C#,Reflection,我有这些课程 class Foo () { public string propA; public Bar propB } class Bar { public string propC; } 当我尝试Foo.GetType().GetProperties()时,它只返回propA 我在这里错过了什么 您的类当前包含字段,而不是属性 现场示例: private string _myField; 物业示例: public string MyField {get;set;} public

我有这些课程

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

class Bar {
 public string propC;
}
当我尝试
Foo.GetType().GetProperties()
时,它只返回propA


我在这里错过了什么

您的类当前包含字段,而不是属性

现场示例:

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

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


请注意,从设计角度来看,字段可能应该是受保护的或私有的。要从类中公开数据,最好使用属性。更多信息。

您的类当前包含字段,而不是属性

现场示例:

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

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


请注意,从设计角度来看,字段可能应该是受保护的或私有的。要从类中公开数据,最好使用属性。更多信息。

在本例中,两个类都有字段。因此,您需要使用
GetType().GetFields()

如果要使用
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;
}

在本例中,两个类都有字段。因此,您需要使用
GetType().GetFields()

如果要使用
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;
}

您需要理解字段和属性之间的区别,在这个答案中有一个很好的解释:

您的示例看起来也很奇怪,因为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。

您需要理解字段和属性之间的区别,这个答案中有一个很好的解释:

您的示例看起来也很奇怪,因为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两个字段。

“我怀疑。”。。?尤其是两者都不是财产。也许这不是使用反射检查的实际程序集/代码?@user2864740这两者都不是属性是什么意思?它们都是字段。
GetProperties
不会返回字段。您没有属性。Foo有2个字段,Bar有1个字段。我不知道有什么不同,谢谢你们“我怀疑”。。?尤其是两者都不是财产。也许这不是使用反射检查的实际程序集/代码?@user2864740这两者都不是属性是什么意思?它们都是字段。
GetProperties
不会返回字段。您没有属性。Foo有2个字段,Bar有1个字段。我不知道有什么不同,谢谢你们