我正在尝试遍历类中的每个属性,输出属性的名称和值。但是我的代码没有返回任何属性。
通过以下方式循环:
public class GameOptions
{
public ushort Fps;
public ushort Height;
public ushort Width;
public bool FreezeOnFocusLost;
public bool ShowCursor;
public bool StaysOnTop;
public bool EscClose;
public string Title;
public bool Debug;
public int DebugInterval = 500;
}
用于遍历所有代码的代码:
foreach (PropertyInfo property in this.Options.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
debugItems.Add("Setting Name: " + property.Name);
debugItems.Add("Setting Value: " + property.GetValue(this,null));
}
然而,当我将public ushort Fps;
更改为public ushort Fps { get; set; }
时,它会找到它。
答案 0 :(得分:7)
public ushort Fps;
public ushort Height;
...
它们不是属性而是字段。请尝试使用GetFields
。或者,可能更好,将它们转换为属性。 E.g。
public ushort Fps {get; set;}
public ushort Height {get; set;}
答案 1 :(得分:3)
您的类仅包含字段,因此GetProperties
将返回空数组。
使用GetFields()
代替
foreach (FieldInfo field in this.Options.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
debugItems.Add("Setting Name: " + field.Name);
debugItems.Add("Setting Value: " + field.GetValue(this));
}
或将您的字段更改为属性
public class GameOptions
{
public ushort Fps { get; set; }
public ushort Height { get; set; }
public ushort Width { get; set; }
// (...)
}
答案 2 :(得分:2)
找到public ushort Fps { get; set; }
但不是public ushort Fps;
的原因是因为后者是字段,而不是属性。
对于字段,您必须使用Type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
答案 3 :(得分:1)
GameOptions
不包含属性。它们都是字段。
执行此操作时:
public ushort Fps { get; set; }
您正在定义auto-implemented
属性,这意味着后台字段是由幕后编译器创建的。当您想要使用字段时,无论如何:
this.Options.GetType().GetFields();
答案 4 :(得分:1)
public class GameOptions
{
public ushort Fps;
public ushort Height;
//...
}
那些是你在那里的领域。
要么使用GetFields
method,它会返回FieldInfo
objects数组:
Type type = this.Options.GetType();
var fields = type.GetFields(
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic);
foreach (var field in fields)
{
debugItems.Add("Setting Name: " + field.Name);
debugItems.Add("Setting Value: " + field.GetValue(this));
}
或将字段设为(auto-implemented)属性:
public class GameOptions
{
public ushort Fps { get; set; }
public ushort Height { get; set; }
//...
}