我有这些课程
class Foo () {
public string propA;
public Bar propB
}
class Bar {
public string propC;
}
当我尝试Foo.GetType().GetProperties()
时,它只会返回propA。
我在这里想念什么?
答案 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;
}