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个字段。我不知道有什么不同,谢谢你们